@23blocks/react 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/context.js +86 -0
- package/dist/lib/context.js.map +1 -0
- package/dist/lib/hooks/index.js +8 -0
- package/dist/lib/hooks/index.js.map +1 -0
- package/dist/lib/hooks/use-auth.js +159 -0
- package/dist/lib/hooks/use-auth.js.map +1 -0
- package/dist/lib/hooks/use-favorites.js +114 -0
- package/dist/lib/hooks/use-favorites.js.map +1 -0
- package/dist/lib/hooks/use-search.js +120 -0
- package/dist/lib/hooks/use-search.js.map +1 -0
- package/dist/lib/hooks/use-users.js +115 -0
- package/dist/lib/hooks/use-users.js.map +1 -0
- package/dist/lib/index.js +8 -0
- package/dist/lib/index.js.map +1 -0
- package/package.json +67 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export * from './lib/index.js';\n"],"names":[],"rangeMappings":"","mappings":"AAAA,cAAc,iBAAiB"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
2
|
+
import { createAuthenticationBlock } from '@23blocks/block-authentication';
|
|
3
|
+
import { createSearchBlock } from '@23blocks/block-search';
|
|
4
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
5
|
+
// Context
|
|
6
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
7
|
+
const Blocks23ContextInternal = /*#__PURE__*/ createContext(null);
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
// Provider Component
|
|
10
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
/**
|
|
12
|
+
* Provider component for 23blocks services.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```tsx
|
|
16
|
+
* import { Blocks23Provider } from '@23blocks/react';
|
|
17
|
+
* import { createHttpTransport } from '@23blocks/transport-http';
|
|
18
|
+
*
|
|
19
|
+
* const transport = createHttpTransport({
|
|
20
|
+
* baseUrl: 'https://api.example.com',
|
|
21
|
+
* headers: () => ({
|
|
22
|
+
* 'Authorization': `Bearer ${localStorage.getItem('token')}`,
|
|
23
|
+
* }),
|
|
24
|
+
* });
|
|
25
|
+
*
|
|
26
|
+
* function App() {
|
|
27
|
+
* return (
|
|
28
|
+
* <Blocks23Provider
|
|
29
|
+
* transport={transport}
|
|
30
|
+
* authentication={{ appId: 'my-app' }}
|
|
31
|
+
* search={{ appId: 'my-app' }}
|
|
32
|
+
* >
|
|
33
|
+
* <MyApp />
|
|
34
|
+
* </Blocks23Provider>
|
|
35
|
+
* );
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/ export function Blocks23Provider({ children, transport, authentication, search }) {
|
|
39
|
+
const value = useMemo(()=>({
|
|
40
|
+
transport,
|
|
41
|
+
authentication: authentication ? createAuthenticationBlock(transport, authentication) : null,
|
|
42
|
+
search: search ? createSearchBlock(transport, search) : null
|
|
43
|
+
}), [
|
|
44
|
+
transport,
|
|
45
|
+
authentication,
|
|
46
|
+
search
|
|
47
|
+
]);
|
|
48
|
+
return /*#__PURE__*/ React.createElement(Blocks23ContextInternal.Provider, {
|
|
49
|
+
value: value
|
|
50
|
+
}, children);
|
|
51
|
+
}
|
|
52
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
53
|
+
// Context Hook
|
|
54
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
55
|
+
/**
|
|
56
|
+
* Hook to access the 23blocks context.
|
|
57
|
+
* Use this for low-level access to blocks.
|
|
58
|
+
*/ export function use23Blocks() {
|
|
59
|
+
const context = useContext(Blocks23ContextInternal);
|
|
60
|
+
if (!context) {
|
|
61
|
+
throw new Error('use23Blocks must be used within a Blocks23Provider');
|
|
62
|
+
}
|
|
63
|
+
return context;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Hook to access the Authentication block.
|
|
67
|
+
* Throws if authentication was not configured in the provider.
|
|
68
|
+
*/ export function useAuthenticationBlock() {
|
|
69
|
+
const { authentication } = use23Blocks();
|
|
70
|
+
if (!authentication) {
|
|
71
|
+
throw new Error('Authentication block not configured. Pass `authentication` prop to Blocks23Provider.');
|
|
72
|
+
}
|
|
73
|
+
return authentication;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Hook to access the Search block.
|
|
77
|
+
* Throws if search was not configured in the provider.
|
|
78
|
+
*/ export function useSearchBlock() {
|
|
79
|
+
const { search } = use23Blocks();
|
|
80
|
+
if (!search) {
|
|
81
|
+
throw new Error('Search block not configured. Pass `search` prop to Blocks23Provider.');
|
|
82
|
+
}
|
|
83
|
+
return search;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/context.tsx"],"sourcesContent":["import { createContext, useContext, useMemo, type ReactNode } from 'react';\nimport type { Transport } from '@23blocks/contracts';\nimport {\n createAuthenticationBlock,\n type AuthenticationBlock,\n type AuthenticationBlockConfig,\n} from '@23blocks/block-authentication';\nimport {\n createSearchBlock,\n type SearchBlock,\n type SearchBlockConfig,\n} from '@23blocks/block-search';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Blocks23Context {\n transport: Transport;\n authentication: AuthenticationBlock | null;\n search: SearchBlock | null;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context\n// ─────────────────────────────────────────────────────────────────────────────\n\nconst Blocks23ContextInternal = createContext<Blocks23Context | null>(null);\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Props\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface Blocks23ProviderProps {\n children: ReactNode;\n\n /**\n * The transport instance (e.g., from createHttpTransport)\n */\n transport: Transport;\n\n /**\n * Authentication block configuration (optional)\n */\n authentication?: AuthenticationBlockConfig;\n\n /**\n * Search block configuration (optional)\n */\n search?: SearchBlockConfig;\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Provider Component\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Provider component for 23blocks services.\n *\n * @example\n * ```tsx\n * import { Blocks23Provider } from '@23blocks/react';\n * import { createHttpTransport } from '@23blocks/transport-http';\n *\n * const transport = createHttpTransport({\n * baseUrl: 'https://api.example.com',\n * headers: () => ({\n * 'Authorization': `Bearer ${localStorage.getItem('token')}`,\n * }),\n * });\n *\n * function App() {\n * return (\n * <Blocks23Provider\n * transport={transport}\n * authentication={{ appId: 'my-app' }}\n * search={{ appId: 'my-app' }}\n * >\n * <MyApp />\n * </Blocks23Provider>\n * );\n * }\n * ```\n */\nexport function Blocks23Provider({\n children,\n transport,\n authentication,\n search,\n}: Blocks23ProviderProps) {\n const value = useMemo<Blocks23Context>(() => ({\n transport,\n authentication: authentication\n ? createAuthenticationBlock(transport, authentication)\n : null,\n search: search\n ? createSearchBlock(transport, search)\n : null,\n }), [transport, authentication, search]);\n\n return (\n <Blocks23ContextInternal.Provider value={value}>\n {children}\n </Blocks23ContextInternal.Provider>\n );\n}\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Context Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook to access the 23blocks context.\n * Use this for low-level access to blocks.\n */\nexport function use23Blocks(): Blocks23Context {\n const context = useContext(Blocks23ContextInternal);\n if (!context) {\n throw new Error('use23Blocks must be used within a Blocks23Provider');\n }\n return context;\n}\n\n/**\n * Hook to access the Authentication block.\n * Throws if authentication was not configured in the provider.\n */\nexport function useAuthenticationBlock(): AuthenticationBlock {\n const { authentication } = use23Blocks();\n if (!authentication) {\n throw new Error(\n 'Authentication block not configured. Pass `authentication` prop to Blocks23Provider.'\n );\n }\n return authentication;\n}\n\n/**\n * Hook to access the Search block.\n * Throws if search was not configured in the provider.\n */\nexport function useSearchBlock(): SearchBlock {\n const { search } = use23Blocks();\n if (!search) {\n throw new Error(\n 'Search block not configured. Pass `search` prop to Blocks23Provider.'\n );\n }\n return search;\n}\n"],"names":["createContext","useContext","useMemo","createAuthenticationBlock","createSearchBlock","Blocks23ContextInternal","Blocks23Provider","children","transport","authentication","search","value","Provider","use23Blocks","context","Error","useAuthenticationBlock","useSearchBlock"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,aAAa,EAAEC,UAAU,EAAEC,OAAO,QAAwB,QAAQ;AAE3E,SACEC,yBAAyB,QAGpB,iCAAiC;AACxC,SACEC,iBAAiB,QAGZ,yBAAyB;AAYhC,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,MAAMC,wCAA0BL,cAAsC;AAyBtE,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BC,GACD,OAAO,SAASM,iBAAiB,EAC/BC,QAAQ,EACRC,SAAS,EACTC,cAAc,EACdC,MAAM,EACgB;IACtB,MAAMC,QAAQT,QAAyB,IAAO,CAAA;YAC5CM;YACAC,gBAAgBA,iBACZN,0BAA0BK,WAAWC,kBACrC;YACJC,QAAQA,SACJN,kBAAkBI,WAAWE,UAC7B;QACN,CAAA,GAAI;QAACF;QAAWC;QAAgBC;KAAO;IAEvC,qBACE,oBAACL,wBAAwBO,QAAQ;QAACD,OAAOA;OACtCJ;AAGP;AAEA,gFAAgF;AAChF,eAAe;AACf,gFAAgF;AAEhF;;;CAGC,GACD,OAAO,SAASM;IACd,MAAMC,UAAUb,WAAWI;IAC3B,IAAI,CAACS,SAAS;QACZ,MAAM,IAAIC,MAAM;IAClB;IACA,OAAOD;AACT;AAEA;;;CAGC,GACD,OAAO,SAASE;IACd,MAAM,EAAEP,cAAc,EAAE,GAAGI;IAC3B,IAAI,CAACJ,gBAAgB;QACnB,MAAM,IAAIM,MACR;IAEJ;IACA,OAAON;AACT;AAEA;;;CAGC,GACD,OAAO,SAASQ;IACd,MAAM,EAAEP,MAAM,EAAE,GAAGG;IACnB,IAAI,CAACH,QAAQ;QACX,MAAM,IAAIK,MACR;IAEJ;IACA,OAAOL;AACT"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Authentication hooks
|
|
2
|
+
export { useAuth } from './use-auth.js';
|
|
3
|
+
export { useUsers } from './use-users.js';
|
|
4
|
+
// Search hooks
|
|
5
|
+
export { useSearch } from './use-search.js';
|
|
6
|
+
export { useFavorites } from './use-favorites.js';
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/hooks/index.ts"],"sourcesContent":["// Authentication hooks\nexport { useAuth, type UseAuthReturn, type UseAuthState, type UseAuthActions } from './use-auth.js';\nexport { useUsers, type UseUsersReturn, type UseUsersState, type UseUsersActions } from './use-users.js';\n\n// Search hooks\nexport { useSearch, type UseSearchReturn, type UseSearchState, type UseSearchActions } from './use-search.js';\nexport { useFavorites, type UseFavoritesReturn, type UseFavoritesState, type UseFavoritesActions } from './use-favorites.js';\n"],"names":["useAuth","useUsers","useSearch","useFavorites"],"rangeMappings":";;;;;","mappings":"AAAA,uBAAuB;AACvB,SAASA,OAAO,QAAoE,gBAAgB;AACpG,SAASC,QAAQ,QAAuE,iBAAiB;AAEzG,eAAe;AACf,SAASC,SAAS,QAA0E,kBAAkB;AAC9G,SAASC,YAAY,QAAmF,qBAAqB"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { useAuthenticationBlock } from '../context.js';
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
// Hook
|
|
5
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Hook for authentication operations with state management.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* function LoginForm() {
|
|
12
|
+
* const { signIn, isLoading, error, user } = useAuth();
|
|
13
|
+
*
|
|
14
|
+
* const handleSubmit = async (e: FormEvent) => {
|
|
15
|
+
* e.preventDefault();
|
|
16
|
+
* try {
|
|
17
|
+
* await signIn({ email, password });
|
|
18
|
+
* navigate('/dashboard');
|
|
19
|
+
* } catch (err) {
|
|
20
|
+
* // Error is automatically captured in `error` state
|
|
21
|
+
* }
|
|
22
|
+
* };
|
|
23
|
+
*
|
|
24
|
+
* if (user) {
|
|
25
|
+
* return <p>Welcome, {user.email}!</p>;
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* return (
|
|
29
|
+
* <form onSubmit={handleSubmit}>
|
|
30
|
+
* {error && <p className="error">{error.message}</p>}
|
|
31
|
+
* <button disabled={isLoading}>
|
|
32
|
+
* {isLoading ? 'Signing in...' : 'Sign In'}
|
|
33
|
+
* </button>
|
|
34
|
+
* </form>
|
|
35
|
+
* );
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/ export function useAuth() {
|
|
39
|
+
const block = useAuthenticationBlock();
|
|
40
|
+
const [user, setUser] = useState(null);
|
|
41
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
42
|
+
const [error, setError] = useState(null);
|
|
43
|
+
const signIn = useCallback(async (request)=>{
|
|
44
|
+
setIsLoading(true);
|
|
45
|
+
setError(null);
|
|
46
|
+
try {
|
|
47
|
+
const response = await block.auth.signIn(request);
|
|
48
|
+
setUser(response.user);
|
|
49
|
+
return response;
|
|
50
|
+
} catch (err) {
|
|
51
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
52
|
+
setError(error);
|
|
53
|
+
throw error;
|
|
54
|
+
} finally{
|
|
55
|
+
setIsLoading(false);
|
|
56
|
+
}
|
|
57
|
+
}, [
|
|
58
|
+
block.auth
|
|
59
|
+
]);
|
|
60
|
+
const signUp = useCallback(async (request)=>{
|
|
61
|
+
setIsLoading(true);
|
|
62
|
+
setError(null);
|
|
63
|
+
try {
|
|
64
|
+
const response = await block.auth.signUp(request);
|
|
65
|
+
setUser(response.user);
|
|
66
|
+
return response;
|
|
67
|
+
} catch (err) {
|
|
68
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
69
|
+
setError(error);
|
|
70
|
+
throw error;
|
|
71
|
+
} finally{
|
|
72
|
+
setIsLoading(false);
|
|
73
|
+
}
|
|
74
|
+
}, [
|
|
75
|
+
block.auth
|
|
76
|
+
]);
|
|
77
|
+
const signOut = useCallback(async ()=>{
|
|
78
|
+
setIsLoading(true);
|
|
79
|
+
setError(null);
|
|
80
|
+
try {
|
|
81
|
+
await block.auth.signOut();
|
|
82
|
+
setUser(null);
|
|
83
|
+
} catch (err) {
|
|
84
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
85
|
+
setError(error);
|
|
86
|
+
throw error;
|
|
87
|
+
} finally{
|
|
88
|
+
setIsLoading(false);
|
|
89
|
+
}
|
|
90
|
+
}, [
|
|
91
|
+
block.auth
|
|
92
|
+
]);
|
|
93
|
+
const requestPasswordReset = useCallback(async (request)=>{
|
|
94
|
+
setIsLoading(true);
|
|
95
|
+
setError(null);
|
|
96
|
+
try {
|
|
97
|
+
await block.auth.requestPasswordReset(request);
|
|
98
|
+
} catch (err) {
|
|
99
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
100
|
+
setError(error);
|
|
101
|
+
throw error;
|
|
102
|
+
} finally{
|
|
103
|
+
setIsLoading(false);
|
|
104
|
+
}
|
|
105
|
+
}, [
|
|
106
|
+
block.auth
|
|
107
|
+
]);
|
|
108
|
+
const updatePassword = useCallback(async (request)=>{
|
|
109
|
+
setIsLoading(true);
|
|
110
|
+
setError(null);
|
|
111
|
+
try {
|
|
112
|
+
await block.auth.updatePassword(request);
|
|
113
|
+
} catch (err) {
|
|
114
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
115
|
+
setError(error);
|
|
116
|
+
throw error;
|
|
117
|
+
} finally{
|
|
118
|
+
setIsLoading(false);
|
|
119
|
+
}
|
|
120
|
+
}, [
|
|
121
|
+
block.auth
|
|
122
|
+
]);
|
|
123
|
+
const refreshUser = useCallback(async ()=>{
|
|
124
|
+
setIsLoading(true);
|
|
125
|
+
setError(null);
|
|
126
|
+
try {
|
|
127
|
+
const currentUser = await block.auth.getCurrentUser();
|
|
128
|
+
setUser(currentUser);
|
|
129
|
+
} catch (err) {
|
|
130
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
131
|
+
setError(error);
|
|
132
|
+
throw error;
|
|
133
|
+
} finally{
|
|
134
|
+
setIsLoading(false);
|
|
135
|
+
}
|
|
136
|
+
}, [
|
|
137
|
+
block.auth
|
|
138
|
+
]);
|
|
139
|
+
const clearError = useCallback(()=>{
|
|
140
|
+
setError(null);
|
|
141
|
+
}, []);
|
|
142
|
+
return {
|
|
143
|
+
// State
|
|
144
|
+
user,
|
|
145
|
+
isLoading,
|
|
146
|
+
error,
|
|
147
|
+
isAuthenticated: user !== null,
|
|
148
|
+
// Actions
|
|
149
|
+
signIn,
|
|
150
|
+
signUp,
|
|
151
|
+
signOut,
|
|
152
|
+
requestPasswordReset,
|
|
153
|
+
updatePassword,
|
|
154
|
+
refreshUser,
|
|
155
|
+
clearError
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
//# sourceMappingURL=use-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/hooks/use-auth.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport type {\n User,\n SignInRequest,\n SignInResponse,\n SignUpRequest,\n SignUpResponse,\n PasswordResetRequest,\n PasswordUpdateRequest,\n} from '@23blocks/block-authentication';\nimport { useAuthenticationBlock } from '../context.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UseAuthState {\n user: User | null;\n isLoading: boolean;\n error: Error | null;\n isAuthenticated: boolean;\n}\n\nexport interface UseAuthActions {\n signIn: (request: SignInRequest) => Promise<SignInResponse>;\n signUp: (request: SignUpRequest) => Promise<SignUpResponse>;\n signOut: () => Promise<void>;\n requestPasswordReset: (request: PasswordResetRequest) => Promise<void>;\n updatePassword: (request: PasswordUpdateRequest) => Promise<void>;\n refreshUser: () => Promise<void>;\n clearError: () => void;\n}\n\nexport type UseAuthReturn = UseAuthState & UseAuthActions;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for authentication operations with state management.\n *\n * @example\n * ```tsx\n * function LoginForm() {\n * const { signIn, isLoading, error, user } = useAuth();\n *\n * const handleSubmit = async (e: FormEvent) => {\n * e.preventDefault();\n * try {\n * await signIn({ email, password });\n * navigate('/dashboard');\n * } catch (err) {\n * // Error is automatically captured in `error` state\n * }\n * };\n *\n * if (user) {\n * return <p>Welcome, {user.email}!</p>;\n * }\n *\n * return (\n * <form onSubmit={handleSubmit}>\n * {error && <p className=\"error\">{error.message}</p>}\n * <button disabled={isLoading}>\n * {isLoading ? 'Signing in...' : 'Sign In'}\n * </button>\n * </form>\n * );\n * }\n * ```\n */\nexport function useAuth(): UseAuthReturn {\n const block = useAuthenticationBlock();\n\n const [user, setUser] = useState<User | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const signIn = useCallback(async (request: SignInRequest): Promise<SignInResponse> => {\n setIsLoading(true);\n setError(null);\n try {\n const response = await block.auth.signIn(request);\n setUser(response.user);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.auth]);\n\n const signUp = useCallback(async (request: SignUpRequest): Promise<SignUpResponse> => {\n setIsLoading(true);\n setError(null);\n try {\n const response = await block.auth.signUp(request);\n setUser(response.user);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.auth]);\n\n const signOut = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n await block.auth.signOut();\n setUser(null);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.auth]);\n\n const requestPasswordReset = useCallback(async (request: PasswordResetRequest): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n await block.auth.requestPasswordReset(request);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.auth]);\n\n const updatePassword = useCallback(async (request: PasswordUpdateRequest): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n await block.auth.updatePassword(request);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.auth]);\n\n const refreshUser = useCallback(async (): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n const currentUser = await block.auth.getCurrentUser();\n setUser(currentUser);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.auth]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n // State\n user,\n isLoading,\n error,\n isAuthenticated: user !== null,\n\n // Actions\n signIn,\n signUp,\n signOut,\n requestPasswordReset,\n updatePassword,\n refreshUser,\n clearError,\n };\n}\n"],"names":["useState","useCallback","useAuthenticationBlock","useAuth","block","user","setUser","isLoading","setIsLoading","error","setError","signIn","request","response","auth","err","Error","String","signUp","signOut","requestPasswordReset","updatePassword","refreshUser","currentUser","getCurrentUser","clearError","isAuthenticated"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,EAAEC,WAAW,QAAQ,QAAQ;AAU9C,SAASC,sBAAsB,QAAQ,gBAAgB;AAyBvD,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgCC,GACD,OAAO,SAASC;IACd,MAAMC,QAAQF;IAEd,MAAM,CAACG,MAAMC,QAAQ,GAAGN,SAAsB;IAC9C,MAAM,CAACO,WAAWC,aAAa,GAAGR,SAAS;IAC3C,MAAM,CAACS,OAAOC,SAAS,GAAGV,SAAuB;IAEjD,MAAMW,SAASV,YAAY,OAAOW;QAChCJ,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMG,WAAW,MAAMT,MAAMU,IAAI,CAACH,MAAM,CAACC;YACzCN,QAAQO,SAASR,IAAI;YACrB,OAAOQ;QACT,EAAE,OAAOE,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMU,IAAI;KAAC;IAEf,MAAMI,SAASjB,YAAY,OAAOW;QAChCJ,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMG,WAAW,MAAMT,MAAMU,IAAI,CAACI,MAAM,CAACN;YACzCN,QAAQO,SAASR,IAAI;YACrB,OAAOQ;QACT,EAAE,OAAOE,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMU,IAAI;KAAC;IAEf,MAAMK,UAAUlB,YAAY;QAC1BO,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMN,MAAMU,IAAI,CAACK,OAAO;YACxBb,QAAQ;QACV,EAAE,OAAOS,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMU,IAAI;KAAC;IAEf,MAAMM,uBAAuBnB,YAAY,OAAOW;QAC9CJ,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMN,MAAMU,IAAI,CAACM,oBAAoB,CAACR;QACxC,EAAE,OAAOG,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMU,IAAI;KAAC;IAEf,MAAMO,iBAAiBpB,YAAY,OAAOW;QACxCJ,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMN,MAAMU,IAAI,CAACO,cAAc,CAACT;QAClC,EAAE,OAAOG,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMU,IAAI;KAAC;IAEf,MAAMQ,cAAcrB,YAAY;QAC9BO,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMa,cAAc,MAAMnB,MAAMU,IAAI,CAACU,cAAc;YACnDlB,QAAQiB;QACV,EAAE,OAAOR,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMU,IAAI;KAAC;IAEf,MAAMW,aAAaxB,YAAY;QAC7BS,SAAS;IACX,GAAG,EAAE;IAEL,OAAO;QACL,QAAQ;QACRL;QACAE;QACAE;QACAiB,iBAAiBrB,SAAS;QAE1B,UAAU;QACVM;QACAO;QACAC;QACAC;QACAC;QACAC;QACAG;IACF;AACF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { useSearchBlock } from '../context.js';
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
// Hook
|
|
5
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Hook for managing favorites.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* function FavoritesList() {
|
|
12
|
+
* const { favorites, listFavorites, removeFavorite, isLoading } = useFavorites();
|
|
13
|
+
*
|
|
14
|
+
* useEffect(() => {
|
|
15
|
+
* listFavorites();
|
|
16
|
+
* }, [listFavorites]);
|
|
17
|
+
*
|
|
18
|
+
* return (
|
|
19
|
+
* <ul>
|
|
20
|
+
* {favorites.map(fav => (
|
|
21
|
+
* <li key={fav.id}>
|
|
22
|
+
* {fav.entityDescription}
|
|
23
|
+
* <button onClick={() => removeFavorite(fav.id)}>Remove</button>
|
|
24
|
+
* </li>
|
|
25
|
+
* ))}
|
|
26
|
+
* </ul>
|
|
27
|
+
* );
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/ export function useFavorites() {
|
|
31
|
+
const block = useSearchBlock();
|
|
32
|
+
const [favorites, setFavorites] = useState([]);
|
|
33
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
34
|
+
const [error, setError] = useState(null);
|
|
35
|
+
const listFavorites = useCallback(async ()=>{
|
|
36
|
+
setIsLoading(true);
|
|
37
|
+
setError(null);
|
|
38
|
+
try {
|
|
39
|
+
const result = await block.favorites.list();
|
|
40
|
+
setFavorites(result);
|
|
41
|
+
return result;
|
|
42
|
+
} catch (err) {
|
|
43
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
44
|
+
setError(error);
|
|
45
|
+
throw error;
|
|
46
|
+
} finally{
|
|
47
|
+
setIsLoading(false);
|
|
48
|
+
}
|
|
49
|
+
}, [
|
|
50
|
+
block.favorites
|
|
51
|
+
]);
|
|
52
|
+
const addFavorite = useCallback(async (request)=>{
|
|
53
|
+
setIsLoading(true);
|
|
54
|
+
setError(null);
|
|
55
|
+
try {
|
|
56
|
+
const favorite = await block.favorites.add(request);
|
|
57
|
+
setFavorites((prev)=>[
|
|
58
|
+
...prev,
|
|
59
|
+
favorite
|
|
60
|
+
]);
|
|
61
|
+
return favorite;
|
|
62
|
+
} catch (err) {
|
|
63
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
64
|
+
setError(error);
|
|
65
|
+
throw error;
|
|
66
|
+
} finally{
|
|
67
|
+
setIsLoading(false);
|
|
68
|
+
}
|
|
69
|
+
}, [
|
|
70
|
+
block.favorites
|
|
71
|
+
]);
|
|
72
|
+
const removeFavorite = useCallback(async (id)=>{
|
|
73
|
+
setIsLoading(true);
|
|
74
|
+
setError(null);
|
|
75
|
+
try {
|
|
76
|
+
await block.favorites.remove(id);
|
|
77
|
+
setFavorites((prev)=>prev.filter((f)=>f.id !== id));
|
|
78
|
+
} catch (err) {
|
|
79
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
80
|
+
setError(error);
|
|
81
|
+
throw error;
|
|
82
|
+
} finally{
|
|
83
|
+
setIsLoading(false);
|
|
84
|
+
}
|
|
85
|
+
}, [
|
|
86
|
+
block.favorites
|
|
87
|
+
]);
|
|
88
|
+
const isFavorite = useCallback(async (entityUniqueId)=>{
|
|
89
|
+
try {
|
|
90
|
+
return await block.favorites.isFavorite(entityUniqueId);
|
|
91
|
+
} catch (err) {
|
|
92
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
93
|
+
setError(error);
|
|
94
|
+
throw error;
|
|
95
|
+
}
|
|
96
|
+
}, [
|
|
97
|
+
block.favorites
|
|
98
|
+
]);
|
|
99
|
+
const clearError = useCallback(()=>{
|
|
100
|
+
setError(null);
|
|
101
|
+
}, []);
|
|
102
|
+
return {
|
|
103
|
+
favorites,
|
|
104
|
+
isLoading,
|
|
105
|
+
error,
|
|
106
|
+
listFavorites,
|
|
107
|
+
addFavorite,
|
|
108
|
+
removeFavorite,
|
|
109
|
+
isFavorite,
|
|
110
|
+
clearError
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
//# sourceMappingURL=use-favorites.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/hooks/use-favorites.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport type {\n FavoriteEntity,\n AddFavoriteRequest,\n} from '@23blocks/block-search';\nimport { useSearchBlock } from '../context.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UseFavoritesState {\n favorites: FavoriteEntity[];\n isLoading: boolean;\n error: Error | null;\n}\n\nexport interface UseFavoritesActions {\n listFavorites: () => Promise<FavoriteEntity[]>;\n addFavorite: (request: AddFavoriteRequest) => Promise<FavoriteEntity>;\n removeFavorite: (id: string) => Promise<void>;\n isFavorite: (entityUniqueId: string) => Promise<boolean>;\n clearError: () => void;\n}\n\nexport type UseFavoritesReturn = UseFavoritesState & UseFavoritesActions;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for managing favorites.\n *\n * @example\n * ```tsx\n * function FavoritesList() {\n * const { favorites, listFavorites, removeFavorite, isLoading } = useFavorites();\n *\n * useEffect(() => {\n * listFavorites();\n * }, [listFavorites]);\n *\n * return (\n * <ul>\n * {favorites.map(fav => (\n * <li key={fav.id}>\n * {fav.entityDescription}\n * <button onClick={() => removeFavorite(fav.id)}>Remove</button>\n * </li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useFavorites(): UseFavoritesReturn {\n const block = useSearchBlock();\n\n const [favorites, setFavorites] = useState<FavoriteEntity[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const listFavorites = useCallback(async (): Promise<FavoriteEntity[]> => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await block.favorites.list();\n setFavorites(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.favorites]);\n\n const addFavorite = useCallback(async (\n request: AddFavoriteRequest\n ): Promise<FavoriteEntity> => {\n setIsLoading(true);\n setError(null);\n try {\n const favorite = await block.favorites.add(request);\n setFavorites(prev => [...prev, favorite]);\n return favorite;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.favorites]);\n\n const removeFavorite = useCallback(async (id: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n await block.favorites.remove(id);\n setFavorites(prev => prev.filter(f => f.id !== id));\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.favorites]);\n\n const isFavorite = useCallback(async (entityUniqueId: string): Promise<boolean> => {\n try {\n return await block.favorites.isFavorite(entityUniqueId);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n }\n }, [block.favorites]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n favorites,\n isLoading,\n error,\n listFavorites,\n addFavorite,\n removeFavorite,\n isFavorite,\n clearError,\n };\n}\n"],"names":["useState","useCallback","useSearchBlock","useFavorites","block","favorites","setFavorites","isLoading","setIsLoading","error","setError","listFavorites","result","list","err","Error","String","addFavorite","request","favorite","add","prev","removeFavorite","id","remove","filter","f","isFavorite","entityUniqueId","clearError"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,EAAEC,WAAW,QAAQ,QAAQ;AAK9C,SAASC,cAAc,QAAQ,gBAAgB;AAsB/C,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GACD,OAAO,SAASC;IACd,MAAMC,QAAQF;IAEd,MAAM,CAACG,WAAWC,aAAa,GAAGN,SAA2B,EAAE;IAC/D,MAAM,CAACO,WAAWC,aAAa,GAAGR,SAAS;IAC3C,MAAM,CAACS,OAAOC,SAAS,GAAGV,SAAuB;IAEjD,MAAMW,gBAAgBV,YAAY;QAChCO,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAME,SAAS,MAAMR,MAAMC,SAAS,CAACQ,IAAI;YACzCP,aAAaM;YACb,OAAOA;QACT,EAAE,OAAOE,KAAK;YACZ,MAAML,QAAQK,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DJ,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMC,SAAS;KAAC;IAEpB,MAAMY,cAAchB,YAAY,OAC9BiB;QAEAV,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMS,WAAW,MAAMf,MAAMC,SAAS,CAACe,GAAG,CAACF;YAC3CZ,aAAae,CAAAA,OAAQ;uBAAIA;oBAAMF;iBAAS;YACxC,OAAOA;QACT,EAAE,OAAOL,KAAK;YACZ,MAAML,QAAQK,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DJ,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMC,SAAS;KAAC;IAEpB,MAAMiB,iBAAiBrB,YAAY,OAAOsB;QACxCf,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMN,MAAMC,SAAS,CAACmB,MAAM,CAACD;YAC7BjB,aAAae,CAAAA,OAAQA,KAAKI,MAAM,CAACC,CAAAA,IAAKA,EAAEH,EAAE,KAAKA;QACjD,EAAE,OAAOT,KAAK;YACZ,MAAML,QAAQK,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DJ,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMC,SAAS;KAAC;IAEpB,MAAMsB,aAAa1B,YAAY,OAAO2B;QACpC,IAAI;YACF,OAAO,MAAMxB,MAAMC,SAAS,CAACsB,UAAU,CAACC;QAC1C,EAAE,OAAOd,KAAK;YACZ,MAAML,QAAQK,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DJ,SAASD;YACT,MAAMA;QACR;IACF,GAAG;QAACL,MAAMC,SAAS;KAAC;IAEpB,MAAMwB,aAAa5B,YAAY;QAC7BS,SAAS;IACX,GAAG,EAAE;IAEL,OAAO;QACLL;QACAE;QACAE;QACAE;QACAM;QACAK;QACAK;QACAE;IACF;AACF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { useSearchBlock } from '../context.js';
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
// Hook
|
|
5
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Hook for search operations with state management.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* function SearchPage() {
|
|
12
|
+
* const { results, search, isLoading, query } = useSearch();
|
|
13
|
+
* const [inputValue, setInputValue] = useState('');
|
|
14
|
+
*
|
|
15
|
+
* const handleSearch = async (e: FormEvent) => {
|
|
16
|
+
* e.preventDefault();
|
|
17
|
+
* await search({ query: inputValue });
|
|
18
|
+
* };
|
|
19
|
+
*
|
|
20
|
+
* return (
|
|
21
|
+
* <div>
|
|
22
|
+
* <form onSubmit={handleSearch}>
|
|
23
|
+
* <input
|
|
24
|
+
* value={inputValue}
|
|
25
|
+
* onChange={(e) => setInputValue(e.target.value)}
|
|
26
|
+
* placeholder="Search..."
|
|
27
|
+
* />
|
|
28
|
+
* <button disabled={isLoading}>Search</button>
|
|
29
|
+
* </form>
|
|
30
|
+
*
|
|
31
|
+
* {query && <p>Results for: {query}</p>}
|
|
32
|
+
*
|
|
33
|
+
* <ul>
|
|
34
|
+
* {results.map(result => (
|
|
35
|
+
* <li key={result.id}>{result.entityDescription}</li>
|
|
36
|
+
* ))}
|
|
37
|
+
* </ul>
|
|
38
|
+
* </div>
|
|
39
|
+
* );
|
|
40
|
+
* }
|
|
41
|
+
* ```
|
|
42
|
+
*/ export function useSearch() {
|
|
43
|
+
const block = useSearchBlock();
|
|
44
|
+
const [results, setResults] = useState([]);
|
|
45
|
+
const [totalRecords, setTotalRecords] = useState(0);
|
|
46
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
47
|
+
const [error, setError] = useState(null);
|
|
48
|
+
const [query, setQuery] = useState('');
|
|
49
|
+
const search = useCallback(async (request)=>{
|
|
50
|
+
setIsLoading(true);
|
|
51
|
+
setError(null);
|
|
52
|
+
setQuery(request.query);
|
|
53
|
+
try {
|
|
54
|
+
const response = await block.search.search(request);
|
|
55
|
+
setResults(response.results);
|
|
56
|
+
setTotalRecords(response.totalRecords);
|
|
57
|
+
return response;
|
|
58
|
+
} catch (err) {
|
|
59
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
60
|
+
setError(error);
|
|
61
|
+
throw error;
|
|
62
|
+
} finally{
|
|
63
|
+
setIsLoading(false);
|
|
64
|
+
}
|
|
65
|
+
}, [
|
|
66
|
+
block.search
|
|
67
|
+
]);
|
|
68
|
+
const suggest = useCallback(async (query, limit)=>{
|
|
69
|
+
setIsLoading(true);
|
|
70
|
+
setError(null);
|
|
71
|
+
try {
|
|
72
|
+
return await block.search.suggest(query, limit);
|
|
73
|
+
} catch (err) {
|
|
74
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
75
|
+
setError(error);
|
|
76
|
+
throw error;
|
|
77
|
+
} finally{
|
|
78
|
+
setIsLoading(false);
|
|
79
|
+
}
|
|
80
|
+
}, [
|
|
81
|
+
block.search
|
|
82
|
+
]);
|
|
83
|
+
const getEntityTypes = useCallback(async ()=>{
|
|
84
|
+
setIsLoading(true);
|
|
85
|
+
setError(null);
|
|
86
|
+
try {
|
|
87
|
+
return await block.search.entityTypes();
|
|
88
|
+
} catch (err) {
|
|
89
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
90
|
+
setError(error);
|
|
91
|
+
throw error;
|
|
92
|
+
} finally{
|
|
93
|
+
setIsLoading(false);
|
|
94
|
+
}
|
|
95
|
+
}, [
|
|
96
|
+
block.search
|
|
97
|
+
]);
|
|
98
|
+
const clearResults = useCallback(()=>{
|
|
99
|
+
setResults([]);
|
|
100
|
+
setTotalRecords(0);
|
|
101
|
+
setQuery('');
|
|
102
|
+
}, []);
|
|
103
|
+
const clearError = useCallback(()=>{
|
|
104
|
+
setError(null);
|
|
105
|
+
}, []);
|
|
106
|
+
return {
|
|
107
|
+
results,
|
|
108
|
+
totalRecords,
|
|
109
|
+
isLoading,
|
|
110
|
+
error,
|
|
111
|
+
query,
|
|
112
|
+
search,
|
|
113
|
+
suggest,
|
|
114
|
+
getEntityTypes,
|
|
115
|
+
clearResults,
|
|
116
|
+
clearError
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
//# sourceMappingURL=use-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/hooks/use-search.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport type {\n SearchResult,\n SearchRequest,\n SearchResponse,\n EntityType,\n} from '@23blocks/block-search';\nimport { useSearchBlock } from '../context.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UseSearchState {\n results: SearchResult[];\n totalRecords: number;\n isLoading: boolean;\n error: Error | null;\n query: string;\n}\n\nexport interface UseSearchActions {\n search: (request: SearchRequest) => Promise<SearchResponse>;\n suggest: (query: string, limit?: number) => Promise<SearchResult[]>;\n getEntityTypes: () => Promise<EntityType[]>;\n clearResults: () => void;\n clearError: () => void;\n}\n\nexport type UseSearchReturn = UseSearchState & UseSearchActions;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for search operations with state management.\n *\n * @example\n * ```tsx\n * function SearchPage() {\n * const { results, search, isLoading, query } = useSearch();\n * const [inputValue, setInputValue] = useState('');\n *\n * const handleSearch = async (e: FormEvent) => {\n * e.preventDefault();\n * await search({ query: inputValue });\n * };\n *\n * return (\n * <div>\n * <form onSubmit={handleSearch}>\n * <input\n * value={inputValue}\n * onChange={(e) => setInputValue(e.target.value)}\n * placeholder=\"Search...\"\n * />\n * <button disabled={isLoading}>Search</button>\n * </form>\n *\n * {query && <p>Results for: {query}</p>}\n *\n * <ul>\n * {results.map(result => (\n * <li key={result.id}>{result.entityDescription}</li>\n * ))}\n * </ul>\n * </div>\n * );\n * }\n * ```\n */\nexport function useSearch(): UseSearchReturn {\n const block = useSearchBlock();\n\n const [results, setResults] = useState<SearchResult[]>([]);\n const [totalRecords, setTotalRecords] = useState(0);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [query, setQuery] = useState('');\n\n const search = useCallback(async (request: SearchRequest): Promise<SearchResponse> => {\n setIsLoading(true);\n setError(null);\n setQuery(request.query);\n try {\n const response = await block.search.search(request);\n setResults(response.results);\n setTotalRecords(response.totalRecords);\n return response;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.search]);\n\n const suggest = useCallback(async (\n query: string,\n limit?: number\n ): Promise<SearchResult[]> => {\n setIsLoading(true);\n setError(null);\n try {\n return await block.search.suggest(query, limit);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.search]);\n\n const getEntityTypes = useCallback(async (): Promise<EntityType[]> => {\n setIsLoading(true);\n setError(null);\n try {\n return await block.search.entityTypes();\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.search]);\n\n const clearResults = useCallback(() => {\n setResults([]);\n setTotalRecords(0);\n setQuery('');\n }, []);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n results,\n totalRecords,\n isLoading,\n error,\n query,\n search,\n suggest,\n getEntityTypes,\n clearResults,\n clearError,\n };\n}\n"],"names":["useState","useCallback","useSearchBlock","useSearch","block","results","setResults","totalRecords","setTotalRecords","isLoading","setIsLoading","error","setError","query","setQuery","search","request","response","err","Error","String","suggest","limit","getEntityTypes","entityTypes","clearResults","clearError"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,EAAEC,WAAW,QAAQ,QAAQ;AAO9C,SAASC,cAAc,QAAQ,gBAAgB;AAwB/C,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCC,GACD,OAAO,SAASC;IACd,MAAMC,QAAQF;IAEd,MAAM,CAACG,SAASC,WAAW,GAAGN,SAAyB,EAAE;IACzD,MAAM,CAACO,cAAcC,gBAAgB,GAAGR,SAAS;IACjD,MAAM,CAACS,WAAWC,aAAa,GAAGV,SAAS;IAC3C,MAAM,CAACW,OAAOC,SAAS,GAAGZ,SAAuB;IACjD,MAAM,CAACa,OAAOC,SAAS,GAAGd,SAAS;IAEnC,MAAMe,SAASd,YAAY,OAAOe;QAChCN,aAAa;QACbE,SAAS;QACTE,SAASE,QAAQH,KAAK;QACtB,IAAI;YACF,MAAMI,WAAW,MAAMb,MAAMW,MAAM,CAACA,MAAM,CAACC;YAC3CV,WAAWW,SAASZ,OAAO;YAC3BG,gBAAgBS,SAASV,YAAY;YACrC,OAAOU;QACT,EAAE,OAAOC,KAAK;YACZ,MAAMP,QAAQO,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DN,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACN,MAAMW,MAAM;KAAC;IAEjB,MAAMM,UAAUpB,YAAY,OAC1BY,OACAS;QAEAZ,aAAa;QACbE,SAAS;QACT,IAAI;YACF,OAAO,MAAMR,MAAMW,MAAM,CAACM,OAAO,CAACR,OAAOS;QAC3C,EAAE,OAAOJ,KAAK;YACZ,MAAMP,QAAQO,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DN,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACN,MAAMW,MAAM;KAAC;IAEjB,MAAMQ,iBAAiBtB,YAAY;QACjCS,aAAa;QACbE,SAAS;QACT,IAAI;YACF,OAAO,MAAMR,MAAMW,MAAM,CAACS,WAAW;QACvC,EAAE,OAAON,KAAK;YACZ,MAAMP,QAAQO,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DN,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACN,MAAMW,MAAM;KAAC;IAEjB,MAAMU,eAAexB,YAAY;QAC/BK,WAAW,EAAE;QACbE,gBAAgB;QAChBM,SAAS;IACX,GAAG,EAAE;IAEL,MAAMY,aAAazB,YAAY;QAC7BW,SAAS;IACX,GAAG,EAAE;IAEL,OAAO;QACLP;QACAE;QACAE;QACAE;QACAE;QACAE;QACAM;QACAE;QACAE;QACAC;IACF;AACF"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { useState, useCallback } from 'react';
|
|
2
|
+
import { useAuthenticationBlock } from '../context.js';
|
|
3
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
4
|
+
// Hook
|
|
5
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
/**
|
|
7
|
+
* Hook for user management operations.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```tsx
|
|
11
|
+
* function UserList() {
|
|
12
|
+
* const { users, listUsers, isLoading, error } = useUsers();
|
|
13
|
+
*
|
|
14
|
+
* useEffect(() => {
|
|
15
|
+
* listUsers({ page: 1, perPage: 20 });
|
|
16
|
+
* }, [listUsers]);
|
|
17
|
+
*
|
|
18
|
+
* if (isLoading) return <Spinner />;
|
|
19
|
+
* if (error) return <Error message={error.message} />;
|
|
20
|
+
*
|
|
21
|
+
* return (
|
|
22
|
+
* <ul>
|
|
23
|
+
* {users.map(user => (
|
|
24
|
+
* <li key={user.id}>{user.email}</li>
|
|
25
|
+
* ))}
|
|
26
|
+
* </ul>
|
|
27
|
+
* );
|
|
28
|
+
* }
|
|
29
|
+
* ```
|
|
30
|
+
*/ export function useUsers() {
|
|
31
|
+
const block = useAuthenticationBlock();
|
|
32
|
+
const [users, setUsers] = useState([]);
|
|
33
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
34
|
+
const [error, setError] = useState(null);
|
|
35
|
+
const listUsers = useCallback(async (params)=>{
|
|
36
|
+
setIsLoading(true);
|
|
37
|
+
setError(null);
|
|
38
|
+
try {
|
|
39
|
+
const result = await block.users.list(params);
|
|
40
|
+
setUsers(result);
|
|
41
|
+
return result;
|
|
42
|
+
} catch (err) {
|
|
43
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
44
|
+
setError(error);
|
|
45
|
+
throw error;
|
|
46
|
+
} finally{
|
|
47
|
+
setIsLoading(false);
|
|
48
|
+
}
|
|
49
|
+
}, [
|
|
50
|
+
block.users
|
|
51
|
+
]);
|
|
52
|
+
const getUser = useCallback(async (id)=>{
|
|
53
|
+
setIsLoading(true);
|
|
54
|
+
setError(null);
|
|
55
|
+
try {
|
|
56
|
+
return await block.users.get(id);
|
|
57
|
+
} catch (err) {
|
|
58
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
59
|
+
setError(error);
|
|
60
|
+
throw error;
|
|
61
|
+
} finally{
|
|
62
|
+
setIsLoading(false);
|
|
63
|
+
}
|
|
64
|
+
}, [
|
|
65
|
+
block.users
|
|
66
|
+
]);
|
|
67
|
+
const updateUser = useCallback(async (id, request)=>{
|
|
68
|
+
setIsLoading(true);
|
|
69
|
+
setError(null);
|
|
70
|
+
try {
|
|
71
|
+
const updated = await block.users.update(id, request);
|
|
72
|
+
setUsers((prev)=>prev.map((u)=>u.id === id ? updated : u));
|
|
73
|
+
return updated;
|
|
74
|
+
} catch (err) {
|
|
75
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
76
|
+
setError(error);
|
|
77
|
+
throw error;
|
|
78
|
+
} finally{
|
|
79
|
+
setIsLoading(false);
|
|
80
|
+
}
|
|
81
|
+
}, [
|
|
82
|
+
block.users
|
|
83
|
+
]);
|
|
84
|
+
const deleteUser = useCallback(async (id)=>{
|
|
85
|
+
setIsLoading(true);
|
|
86
|
+
setError(null);
|
|
87
|
+
try {
|
|
88
|
+
await block.users.delete(id);
|
|
89
|
+
setUsers((prev)=>prev.filter((u)=>u.id !== id));
|
|
90
|
+
} catch (err) {
|
|
91
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
92
|
+
setError(error);
|
|
93
|
+
throw error;
|
|
94
|
+
} finally{
|
|
95
|
+
setIsLoading(false);
|
|
96
|
+
}
|
|
97
|
+
}, [
|
|
98
|
+
block.users
|
|
99
|
+
]);
|
|
100
|
+
const clearError = useCallback(()=>{
|
|
101
|
+
setError(null);
|
|
102
|
+
}, []);
|
|
103
|
+
return {
|
|
104
|
+
users,
|
|
105
|
+
isLoading,
|
|
106
|
+
error,
|
|
107
|
+
listUsers,
|
|
108
|
+
getUser,
|
|
109
|
+
updateUser,
|
|
110
|
+
deleteUser,
|
|
111
|
+
clearError
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
//# sourceMappingURL=use-users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/hooks/use-users.ts"],"sourcesContent":["import { useState, useCallback } from 'react';\nimport type {\n User,\n UpdateUserRequest,\n} from '@23blocks/block-authentication';\nimport { useAuthenticationBlock } from '../context.js';\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Types\n// ─────────────────────────────────────────────────────────────────────────────\n\nexport interface UseUsersState {\n users: User[];\n isLoading: boolean;\n error: Error | null;\n}\n\nexport interface UseUsersActions {\n listUsers: (params?: { page?: number; perPage?: number }) => Promise<User[]>;\n getUser: (id: string) => Promise<User>;\n updateUser: (id: string, request: UpdateUserRequest) => Promise<User>;\n deleteUser: (id: string) => Promise<void>;\n clearError: () => void;\n}\n\nexport type UseUsersReturn = UseUsersState & UseUsersActions;\n\n// ─────────────────────────────────────────────────────────────────────────────\n// Hook\n// ─────────────────────────────────────────────────────────────────────────────\n\n/**\n * Hook for user management operations.\n *\n * @example\n * ```tsx\n * function UserList() {\n * const { users, listUsers, isLoading, error } = useUsers();\n *\n * useEffect(() => {\n * listUsers({ page: 1, perPage: 20 });\n * }, [listUsers]);\n *\n * if (isLoading) return <Spinner />;\n * if (error) return <Error message={error.message} />;\n *\n * return (\n * <ul>\n * {users.map(user => (\n * <li key={user.id}>{user.email}</li>\n * ))}\n * </ul>\n * );\n * }\n * ```\n */\nexport function useUsers(): UseUsersReturn {\n const block = useAuthenticationBlock();\n\n const [users, setUsers] = useState<User[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const listUsers = useCallback(async (\n params?: { page?: number; perPage?: number }\n ): Promise<User[]> => {\n setIsLoading(true);\n setError(null);\n try {\n const result = await block.users.list(params);\n setUsers(result);\n return result;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.users]);\n\n const getUser = useCallback(async (id: string): Promise<User> => {\n setIsLoading(true);\n setError(null);\n try {\n return await block.users.get(id);\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.users]);\n\n const updateUser = useCallback(async (\n id: string,\n request: UpdateUserRequest\n ): Promise<User> => {\n setIsLoading(true);\n setError(null);\n try {\n const updated = await block.users.update(id, request);\n setUsers(prev => prev.map(u => u.id === id ? updated : u));\n return updated;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.users]);\n\n const deleteUser = useCallback(async (id: string): Promise<void> => {\n setIsLoading(true);\n setError(null);\n try {\n await block.users.delete(id);\n setUsers(prev => prev.filter(u => u.id !== id));\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n setError(error);\n throw error;\n } finally {\n setIsLoading(false);\n }\n }, [block.users]);\n\n const clearError = useCallback(() => {\n setError(null);\n }, []);\n\n return {\n users,\n isLoading,\n error,\n listUsers,\n getUser,\n updateUser,\n deleteUser,\n clearError,\n };\n}\n"],"names":["useState","useCallback","useAuthenticationBlock","useUsers","block","users","setUsers","isLoading","setIsLoading","error","setError","listUsers","params","result","list","err","Error","String","getUser","id","get","updateUser","request","updated","update","prev","map","u","deleteUser","delete","filter","clearError"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA,SAASA,QAAQ,EAAEC,WAAW,QAAQ,QAAQ;AAK9C,SAASC,sBAAsB,QAAQ,gBAAgB;AAsBvD,gFAAgF;AAChF,OAAO;AACP,gFAAgF;AAEhF;;;;;;;;;;;;;;;;;;;;;;;;CAwBC,GACD,OAAO,SAASC;IACd,MAAMC,QAAQF;IAEd,MAAM,CAACG,OAAOC,SAAS,GAAGN,SAAiB,EAAE;IAC7C,MAAM,CAACO,WAAWC,aAAa,GAAGR,SAAS;IAC3C,MAAM,CAACS,OAAOC,SAAS,GAAGV,SAAuB;IAEjD,MAAMW,YAAYV,YAAY,OAC5BW;QAEAJ,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMG,SAAS,MAAMT,MAAMC,KAAK,CAACS,IAAI,CAACF;YACtCN,SAASO;YACT,OAAOA;QACT,EAAE,OAAOE,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMC,KAAK;KAAC;IAEhB,MAAMa,UAAUjB,YAAY,OAAOkB;QACjCX,aAAa;QACbE,SAAS;QACT,IAAI;YACF,OAAO,MAAMN,MAAMC,KAAK,CAACe,GAAG,CAACD;QAC/B,EAAE,OAAOJ,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMC,KAAK;KAAC;IAEhB,MAAMgB,aAAapB,YAAY,OAC7BkB,IACAG;QAEAd,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMa,UAAU,MAAMnB,MAAMC,KAAK,CAACmB,MAAM,CAACL,IAAIG;YAC7ChB,SAASmB,CAAAA,OAAQA,KAAKC,GAAG,CAACC,CAAAA,IAAKA,EAAER,EAAE,KAAKA,KAAKI,UAAUI;YACvD,OAAOJ;QACT,EAAE,OAAOR,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMC,KAAK;KAAC;IAEhB,MAAMuB,aAAa3B,YAAY,OAAOkB;QACpCX,aAAa;QACbE,SAAS;QACT,IAAI;YACF,MAAMN,MAAMC,KAAK,CAACwB,MAAM,CAACV;YACzBb,SAASmB,CAAAA,OAAQA,KAAKK,MAAM,CAACH,CAAAA,IAAKA,EAAER,EAAE,KAAKA;QAC7C,EAAE,OAAOJ,KAAK;YACZ,MAAMN,QAAQM,eAAeC,QAAQD,MAAM,IAAIC,MAAMC,OAAOF;YAC5DL,SAASD;YACT,MAAMA;QACR,SAAU;YACRD,aAAa;QACf;IACF,GAAG;QAACJ,MAAMC,KAAK;KAAC;IAEhB,MAAM0B,aAAa9B,YAAY;QAC7BS,SAAS;IACX,GAAG,EAAE;IAEL,OAAO;QACLL;QACAE;QACAE;QACAE;QACAO;QACAG;QACAO;QACAG;IACF;AACF"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
// Context and Provider
|
|
2
|
+
export { Blocks23Provider, use23Blocks, useAuthenticationBlock, useSearchBlock } from './context.js';
|
|
3
|
+
// Hooks
|
|
4
|
+
export { // Auth
|
|
5
|
+
useAuth, useUsers, // Search
|
|
6
|
+
useSearch, useFavorites } from './hooks/index.js';
|
|
7
|
+
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/lib/index.ts"],"sourcesContent":["// Context and Provider\nexport {\n Blocks23Provider,\n use23Blocks,\n useAuthenticationBlock,\n useSearchBlock,\n type Blocks23ProviderProps,\n type Blocks23Context,\n} from './context.js';\n\n// Hooks\nexport {\n // Auth\n useAuth,\n useUsers,\n type UseAuthReturn,\n type UseAuthState,\n type UseAuthActions,\n type UseUsersReturn,\n type UseUsersState,\n type UseUsersActions,\n\n // Search\n useSearch,\n useFavorites,\n type UseSearchReturn,\n type UseSearchState,\n type UseSearchActions,\n type UseFavoritesReturn,\n type UseFavoritesState,\n type UseFavoritesActions,\n} from './hooks/index.js';\n"],"names":["Blocks23Provider","use23Blocks","useAuthenticationBlock","useSearchBlock","useAuth","useUsers","useSearch","useFavorites"],"rangeMappings":";;;;;","mappings":"AAAA,uBAAuB;AACvB,SACEA,gBAAgB,EAChBC,WAAW,EACXC,sBAAsB,EACtBC,cAAc,QAGT,eAAe;AAEtB,QAAQ;AACR,SACE,OAAO;AACPC,OAAO,EACPC,QAAQ,EAQR,SAAS;AACTC,SAAS,EACTC,YAAY,QAOP,mBAAmB"}
|
package/package.json
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@23blocks/react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "React bindings for 23blocks SDK - hooks and context providers",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "23blocks <hello@23blocks.com>",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/23blocks-OS/frontend-sdk.git",
|
|
10
|
+
"directory": "packages/react"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/23blocks-OS/frontend-sdk/tree/main/packages/react",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/23blocks-OS/frontend-sdk/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"23blocks",
|
|
18
|
+
"sdk",
|
|
19
|
+
"react",
|
|
20
|
+
"hooks",
|
|
21
|
+
"context",
|
|
22
|
+
"provider"
|
|
23
|
+
],
|
|
24
|
+
"type": "module",
|
|
25
|
+
"main": "./dist/index.js",
|
|
26
|
+
"module": "./dist/index.js",
|
|
27
|
+
"types": "./dist/index.d.ts",
|
|
28
|
+
"exports": {
|
|
29
|
+
"./package.json": "./package.json",
|
|
30
|
+
".": {
|
|
31
|
+
"types": "./dist/index.d.ts",
|
|
32
|
+
"import": "./dist/index.js",
|
|
33
|
+
"default": "./dist/index.js"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
"files": [
|
|
37
|
+
"dist",
|
|
38
|
+
"!**/*.tsbuildinfo"
|
|
39
|
+
],
|
|
40
|
+
"nx": {
|
|
41
|
+
"sourceRoot": "packages/react/src",
|
|
42
|
+
"targets": {
|
|
43
|
+
"build": {
|
|
44
|
+
"executor": "@nx/js:swc",
|
|
45
|
+
"outputs": [
|
|
46
|
+
"{options.outputPath}"
|
|
47
|
+
],
|
|
48
|
+
"options": {
|
|
49
|
+
"outputPath": "packages/react/dist",
|
|
50
|
+
"main": "packages/react/src/index.ts",
|
|
51
|
+
"tsConfig": "packages/react/tsconfig.lib.json",
|
|
52
|
+
"skipTypeCheck": true,
|
|
53
|
+
"stripLeadingPaths": true
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"dependencies": {
|
|
59
|
+
"@23blocks/contracts": "*",
|
|
60
|
+
"@23blocks/block-authentication": "*",
|
|
61
|
+
"@23blocks/block-search": "*",
|
|
62
|
+
"@swc/helpers": "~0.5.11"
|
|
63
|
+
},
|
|
64
|
+
"peerDependencies": {
|
|
65
|
+
"react": ">=18.0.0"
|
|
66
|
+
}
|
|
67
|
+
}
|