@atomic-solutions/wordpress-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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2024-2026 Atomic Solutions
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # @atomic-solutions/react-wordpress
2
+
3
+ React Query hooks and provider for WordPress REST API.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @atomic-solutions/react-wordpress
9
+ ```
10
+
11
+ ### Peer Dependencies
12
+
13
+ ```bash
14
+ pnpm add react @tanstack/react-query
15
+ ```
16
+
17
+ ## Quick Start
18
+
19
+ ```tsx
20
+ import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
21
+ import { WordPressProvider, usePosts } from '@atomic-solutions/react-wordpress';
22
+
23
+ const queryClient = new QueryClient();
24
+
25
+ function App() {
26
+ return (
27
+ <QueryClientProvider client={queryClient}>
28
+ <WordPressProvider
29
+ config={{
30
+ baseURL: 'https://your-site.com/wp-json',
31
+ }}
32
+ >
33
+ <BlogList />
34
+ </WordPressProvider>
35
+ </QueryClientProvider>
36
+ );
37
+ }
38
+
39
+ function BlogList() {
40
+ const { data, isLoading } = usePosts({ per_page: 10 });
41
+
42
+ if (isLoading) return <div>Loading...</div>;
43
+
44
+ return (
45
+ <div>
46
+ {data?.data.map(post => (
47
+ <article key={post.id}>
48
+ <h2>{post.title.rendered}</h2>
49
+ <div dangerouslySetInnerHTML={{ __html: post.excerpt.rendered }} />
50
+ </article>
51
+ ))}
52
+ </div>
53
+ );
54
+ }
55
+ ```
56
+
57
+ ## Available Hooks
58
+
59
+ ### Posts
60
+ - `usePosts(params?)` - Fetch paginated posts
61
+ - `useInfinitePosts(params?)` - Infinite scrolling posts
62
+ - `usePost(id)` - Fetch single post by ID
63
+ - `usePostBySlug(slug)` - Fetch post by slug
64
+
65
+ ### Categories
66
+ - `useCategories(params?)` - Fetch paginated categories
67
+ - `useInfiniteCategories(params?)` - Infinite scrolling categories
68
+ - `useCategory(id)` - Fetch single category by ID
69
+
70
+ ### Media
71
+ - `useMediaItem(id)` - Fetch media item by ID
72
+
73
+ ### Users
74
+ - `useCurrentUser()` - Fetch current authenticated user
75
+ - `useUser(id)` - Fetch user by ID
76
+
77
+ ### Authentication
78
+ - `useLogin()` - Login mutation (JWT)
79
+ - `useValidateToken()` - Validate JWT token mutation
80
+
81
+ ## Documentation
82
+
83
+ See [CLAUDE.md](./CLAUDE.md) for complete documentation.
84
+
85
+ ## License
86
+
87
+ MIT
@@ -0,0 +1,231 @@
1
+ import {
2
+ WordPressContext
3
+ } from "./chunk-WEGZSYNS.js";
4
+
5
+ // src/hooks/useWordPressClient.ts
6
+ import { useContext } from "react";
7
+ var useWordPressClient = () => {
8
+ const context = useContext(WordPressContext);
9
+ if (!context) {
10
+ throw new Error("useWordPressClient must be used within a WordPressProvider");
11
+ }
12
+ return context.client;
13
+ };
14
+ var useWordPressQueryKeys = () => {
15
+ const context = useContext(WordPressContext);
16
+ if (!context) {
17
+ throw new Error("useWordPressQueryKeys must be used within a WordPressProvider");
18
+ }
19
+ return context.queryKeys;
20
+ };
21
+
22
+ // src/hooks/queryKeys.ts
23
+ var createQueryKeys = (prefix = ["wordpress"]) => {
24
+ return {
25
+ all: prefix,
26
+ posts: {
27
+ all: [...prefix, "posts"],
28
+ lists: () => [...prefix, "posts", "list"],
29
+ list: (params) => [...prefix, "posts", "list", params],
30
+ details: () => [...prefix, "posts", "detail"],
31
+ detail: (id) => [...prefix, "posts", "detail", id],
32
+ bySlug: (slug) => [...prefix, "posts", "slug", slug]
33
+ },
34
+ categories: {
35
+ all: [...prefix, "categories"],
36
+ lists: () => [...prefix, "categories", "list"],
37
+ list: (params) => [...prefix, "categories", "list", params],
38
+ details: () => [...prefix, "categories", "detail"],
39
+ detail: (id) => [...prefix, "categories", "detail", id]
40
+ },
41
+ media: {
42
+ all: [...prefix, "media"],
43
+ details: () => [...prefix, "media", "detail"],
44
+ detail: (id) => [...prefix, "media", "detail", id]
45
+ },
46
+ users: {
47
+ all: [...prefix, "users"],
48
+ me: () => [...prefix, "users", "me"],
49
+ detail: (id) => [...prefix, "users", "detail", id]
50
+ }
51
+ };
52
+ };
53
+ var queryKeys = createQueryKeys();
54
+
55
+ // src/hooks/posts.ts
56
+ import { useInfiniteQuery, useQuery } from "@tanstack/react-query";
57
+ var usePosts = (params, options) => {
58
+ const client = useWordPressClient();
59
+ const queryKeys2 = useWordPressQueryKeys();
60
+ return useQuery({
61
+ queryKey: queryKeys2.posts.list(params),
62
+ queryFn: () => client.posts.list(params),
63
+ staleTime: 1e3 * 60 * 60,
64
+ // 1 hour
65
+ ...options
66
+ });
67
+ };
68
+ var useInfinitePosts = (params) => {
69
+ const client = useWordPressClient();
70
+ const queryKeys2 = useWordPressQueryKeys();
71
+ return useInfiniteQuery({
72
+ queryKey: queryKeys2.posts.lists(),
73
+ queryFn: ({ pageParam = 1 }) => client.posts.list({ ...params, page: pageParam }),
74
+ initialPageParam: 1,
75
+ getNextPageParam: (lastPage) => lastPage.pagination.hasNextPage ? lastPage.pagination.nextPage : void 0,
76
+ getPreviousPageParam: (firstPage) => firstPage.pagination.hasPrevPage ? firstPage.pagination.prevPage : void 0,
77
+ staleTime: 1e3 * 60 * 60
78
+ // 1 hour
79
+ });
80
+ };
81
+ var usePost = (id, options) => {
82
+ const client = useWordPressClient();
83
+ const queryKeys2 = useWordPressQueryKeys();
84
+ return useQuery({
85
+ queryKey: queryKeys2.posts.detail(id),
86
+ queryFn: () => client.posts.get(id),
87
+ staleTime: 1e3 * 60 * 60,
88
+ // 1 hour
89
+ enabled: id > 0,
90
+ ...options
91
+ });
92
+ };
93
+ var usePostBySlug = (slug, options) => {
94
+ const client = useWordPressClient();
95
+ const queryKeys2 = useWordPressQueryKeys();
96
+ return useQuery({
97
+ queryKey: queryKeys2.posts.bySlug(slug),
98
+ queryFn: () => client.posts.getBySlug(slug),
99
+ staleTime: 1e3 * 60 * 60,
100
+ // 1 hour
101
+ enabled: !!slug,
102
+ ...options
103
+ });
104
+ };
105
+
106
+ // src/hooks/categories.ts
107
+ import { useInfiniteQuery as useInfiniteQuery2, useQuery as useQuery2 } from "@tanstack/react-query";
108
+ var useCategories = (params, options) => {
109
+ const client = useWordPressClient();
110
+ const queryKeys2 = useWordPressQueryKeys();
111
+ return useQuery2({
112
+ queryKey: queryKeys2.categories.list(params),
113
+ queryFn: () => client.categories.list(params),
114
+ staleTime: 1e3 * 60 * 60 * 24 * 7,
115
+ // 1 week
116
+ ...options
117
+ });
118
+ };
119
+ var useInfiniteCategories = (params) => {
120
+ const client = useWordPressClient();
121
+ const queryKeys2 = useWordPressQueryKeys();
122
+ return useInfiniteQuery2({
123
+ queryKey: queryKeys2.categories.lists(),
124
+ queryFn: ({ pageParam = 1 }) => client.categories.list({ ...params, page: pageParam }),
125
+ initialPageParam: 1,
126
+ getNextPageParam: (lastPage) => lastPage.pagination.hasNextPage ? lastPage.pagination.nextPage : void 0,
127
+ getPreviousPageParam: (firstPage) => firstPage.pagination.hasPrevPage ? firstPage.pagination.prevPage : void 0,
128
+ staleTime: 1e3 * 60 * 60 * 24 * 7,
129
+ // 1 week
130
+ gcTime: 1e3 * 60 * 60 * 24 * 30
131
+ // 30 days
132
+ });
133
+ };
134
+ var useCategory = (id, options) => {
135
+ const client = useWordPressClient();
136
+ const queryKeys2 = useWordPressQueryKeys();
137
+ return useQuery2({
138
+ queryKey: queryKeys2.categories.detail(id),
139
+ queryFn: () => client.categories.get(id),
140
+ staleTime: 1e3 * 60 * 60 * 24 * 7,
141
+ // 1 week
142
+ enabled: id > 0,
143
+ ...options
144
+ });
145
+ };
146
+
147
+ // src/hooks/media.ts
148
+ import { useQuery as useQuery3 } from "@tanstack/react-query";
149
+ var useMediaItem = (id, options) => {
150
+ const client = useWordPressClient();
151
+ const queryKeys2 = useWordPressQueryKeys();
152
+ return useQuery3({
153
+ queryKey: queryKeys2.media.detail(id || 0),
154
+ queryFn: () => client.media.get(id),
155
+ staleTime: 1e3 * 60 * 60 * 24,
156
+ // 1 day
157
+ gcTime: 1e3 * 60 * 60 * 24 * 7,
158
+ // 1 week
159
+ enabled: !!id && id > 0,
160
+ ...options
161
+ });
162
+ };
163
+
164
+ // src/hooks/users.ts
165
+ import { useQuery as useQuery4 } from "@tanstack/react-query";
166
+ var useCurrentUser = (options) => {
167
+ const client = useWordPressClient();
168
+ const queryKeys2 = useWordPressQueryKeys();
169
+ return useQuery4({
170
+ queryKey: queryKeys2.users.me(),
171
+ queryFn: () => client.users.me(),
172
+ staleTime: 1e3 * 60 * 5,
173
+ // 5 minutes
174
+ retry: false,
175
+ // Don't retry auth failures
176
+ ...options
177
+ });
178
+ };
179
+ var useUser = (id, options) => {
180
+ const client = useWordPressClient();
181
+ const queryKeys2 = useWordPressQueryKeys();
182
+ return useQuery4({
183
+ queryKey: queryKeys2.users.detail(id),
184
+ queryFn: () => client.users.get(id),
185
+ staleTime: 1e3 * 60 * 60,
186
+ // 1 hour
187
+ enabled: id > 0,
188
+ ...options
189
+ });
190
+ };
191
+
192
+ // src/hooks/auth.ts
193
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
194
+ var useLogin = (options) => {
195
+ const client = useWordPressClient();
196
+ const queryKeys2 = useWordPressQueryKeys();
197
+ const queryClient = useQueryClient();
198
+ return useMutation({
199
+ mutationFn: (input) => client.auth.login(input),
200
+ onSuccess: () => {
201
+ queryClient.invalidateQueries({ queryKey: queryKeys2.users.all });
202
+ },
203
+ ...options
204
+ });
205
+ };
206
+ var useValidateToken = (options) => {
207
+ const client = useWordPressClient();
208
+ return useMutation({
209
+ mutationFn: () => client.auth.validateToken(),
210
+ ...options
211
+ });
212
+ };
213
+
214
+ export {
215
+ useWordPressClient,
216
+ useWordPressQueryKeys,
217
+ createQueryKeys,
218
+ usePosts,
219
+ useInfinitePosts,
220
+ usePost,
221
+ usePostBySlug,
222
+ useCategories,
223
+ useInfiniteCategories,
224
+ useCategory,
225
+ useMediaItem,
226
+ useCurrentUser,
227
+ useUser,
228
+ useLogin,
229
+ useValidateToken
230
+ };
231
+ //# sourceMappingURL=chunk-3MTIYB4V.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useWordPressClient.ts","../src/hooks/queryKeys.ts","../src/hooks/posts.ts","../src/hooks/categories.ts","../src/hooks/media.ts","../src/hooks/users.ts","../src/hooks/auth.ts"],"sourcesContent":["/**\n * Hook for accessing WordPress client and query keys from context\n */\n\nimport { useContext } from 'react';\nimport type { WordPressClient } from '@atomic-solutions/wordpress-api-client';\n\nimport { WordPressContext } from '../provider/WordPressContext';\nimport type { QueryKeys } from './queryKeys';\n\n/**\n * Hook to access the WordPress client from context\n *\n * Must be used within a WordPressProvider\n *\n * @returns WordPress client instance\n * @throws Error if used outside WordPressProvider\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * const client = useWordPressClient();\n *\n * const handleFetchPosts = async () => {\n * const posts = await client.posts.list({ per_page: 10 });\n * console.log(posts);\n * };\n *\n * return <button onClick={handleFetchPosts}>Fetch Posts</button>;\n * };\n * ```\n */\nexport const useWordPressClient = (): WordPressClient => {\n const context = useContext(WordPressContext);\n\n if (!context) {\n throw new Error('useWordPressClient must be used within a WordPressProvider');\n }\n\n return context.client;\n};\n\n/**\n * Hook to access WordPress query keys from context\n *\n * Must be used within a WordPressProvider\n *\n * @returns Query keys instance\n * @throws Error if used outside WordPressProvider\n *\n * @example\n * ```tsx\n * function MyComponent() {\n * const queryKeys = useWordPressQueryKeys();\n * const queryClient = useQueryClient();\n *\n * const handleInvalidate = () => {\n * queryClient.invalidateQueries({ queryKey: queryKeys.posts.all });\n * };\n *\n * return <button onClick={handleInvalidate}>Refresh Posts</button>;\n * }\n * ```\n */\nexport const useWordPressQueryKeys = (): QueryKeys => {\n const context = useContext(WordPressContext);\n\n if (!context) {\n throw new Error('useWordPressQueryKeys must be used within a WordPressProvider');\n }\n\n return context.queryKeys;\n};\n","/**\n * React Query key factory\n */\n\nimport type { CategoryParams, PostParams } from '@atomic-solutions/wordpress-api-client';\n\n/**\n * Query keys for WordPress API\n */\nexport interface QueryKeys {\n /** All WordPress queries */\n all: readonly string[];\n\n /** Posts queries */\n posts: {\n all: readonly unknown[];\n lists: () => readonly unknown[];\n list: (params?: PostParams) => readonly unknown[];\n details: () => readonly unknown[];\n detail: (id: number) => readonly unknown[];\n bySlug: (slug: string) => readonly unknown[];\n };\n\n /** Categories queries */\n categories: {\n all: readonly unknown[];\n lists: () => readonly unknown[];\n list: (params?: CategoryParams) => readonly unknown[];\n details: () => readonly unknown[];\n detail: (id: number) => readonly unknown[];\n };\n\n /** Media queries */\n media: {\n all: readonly unknown[];\n details: () => readonly unknown[];\n detail: (id: number) => readonly unknown[];\n };\n\n /** Users queries */\n users: {\n all: readonly unknown[];\n me: () => readonly unknown[];\n detail: (id: number) => readonly unknown[];\n };\n}\n\n/**\n * Create query keys factory with optional prefix\n *\n * @param prefix - Optional prefix for all query keys\n * @returns Query keys factory\n */\nexport const createQueryKeys = (prefix: string[] = ['wordpress']): QueryKeys => {\n return {\n all: prefix,\n\n posts: {\n all: [...prefix, 'posts'] as const,\n lists: () => [...prefix, 'posts', 'list'] as const,\n list: (params?: PostParams) => [...prefix, 'posts', 'list', params] as const,\n details: () => [...prefix, 'posts', 'detail'] as const,\n detail: (id: number) => [...prefix, 'posts', 'detail', id] as const,\n bySlug: (slug: string) => [...prefix, 'posts', 'slug', slug] as const,\n },\n\n categories: {\n all: [...prefix, 'categories'] as const,\n lists: () => [...prefix, 'categories', 'list'] as const,\n list: (params?: CategoryParams) => [...prefix, 'categories', 'list', params] as const,\n details: () => [...prefix, 'categories', 'detail'] as const,\n detail: (id: number) => [...prefix, 'categories', 'detail', id] as const,\n },\n\n media: {\n all: [...prefix, 'media'] as const,\n details: () => [...prefix, 'media', 'detail'] as const,\n detail: (id: number) => [...prefix, 'media', 'detail', id] as const,\n },\n\n users: {\n all: [...prefix, 'users'] as const,\n me: () => [...prefix, 'users', 'me'] as const,\n detail: (id: number) => [...prefix, 'users', 'detail', id] as const,\n },\n };\n};\n\nexport const queryKeys = createQueryKeys();\n","/**\n * Posts React Query hooks\n */\n\nimport type { PaginatedResponse, Post, PostParams } from '@atomic-solutions/wordpress-api-client';\nimport { useInfiniteQuery, useQuery, type UseQueryOptions } from '@tanstack/react-query';\n\nimport { useWordPressClient, useWordPressQueryKeys } from './useWordPressClient';\n\ntype UsePostsOptions = Omit<\n UseQueryOptions<PaginatedResponse<Post>, Error>,\n 'queryKey' | 'queryFn'\n>;\n\ntype UsePostOptions = Omit<UseQueryOptions<Post, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Hook for fetching paginated posts\n *\n * @param params - Post query parameters\n * @param options - React Query options\n */\nexport const usePosts = (params?: PostParams, options?: UsePostsOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.posts.list(params),\n queryFn: () => client.posts.list(params),\n staleTime: 1000 * 60 * 60, // 1 hour\n ...options,\n });\n};\n\n/**\n * Hook for infinite scrolling posts\n *\n * @param params - Base post query parameters (page will be managed automatically)\n */\nexport const useInfinitePosts = (params?: Omit<PostParams, 'page'>) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useInfiniteQuery({\n queryKey: queryKeys.posts.lists(),\n queryFn: ({ pageParam = 1 }) => client.posts.list({ ...params, page: pageParam as number }),\n initialPageParam: 1,\n getNextPageParam: (lastPage) =>\n lastPage.pagination.hasNextPage ? lastPage.pagination.nextPage : undefined,\n getPreviousPageParam: (firstPage) =>\n firstPage.pagination.hasPrevPage ? firstPage.pagination.prevPage : undefined,\n staleTime: 1000 * 60 * 60, // 1 hour\n });\n};\n\n/**\n * Hook for fetching a single post by ID\n *\n * @param id - Post ID\n * @param options - React Query options\n */\nexport const usePost = (id: number, options?: UsePostOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.posts.detail(id),\n queryFn: () => client.posts.get(id),\n staleTime: 1000 * 60 * 60, // 1 hour\n enabled: id > 0,\n ...options,\n });\n};\n\ntype UsePostBySlugOptions = Omit<\n UseQueryOptions<Post | null, Error>,\n 'queryKey' | 'queryFn' | 'enabled'\n>;\n\n/**\n * Hook for fetching a single post by slug\n *\n * @param slug - Post slug\n * @param options - React Query options\n */\nexport const usePostBySlug = (slug: string, options?: UsePostBySlugOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.posts.bySlug(slug),\n queryFn: () => client.posts.getBySlug(slug),\n staleTime: 1000 * 60 * 60, // 1 hour\n enabled: !!slug,\n ...options,\n });\n};\n","/**\n * Categories React Query hooks\n */\n\nimport type {\n Category,\n CategoryParams,\n PaginatedResponse,\n} from '@atomic-solutions/wordpress-api-client';\nimport { useInfiniteQuery, useQuery, type UseQueryOptions } from '@tanstack/react-query';\n\nimport { useWordPressClient, useWordPressQueryKeys } from './useWordPressClient';\n\ntype UseCategoriesOptions = Omit<\n UseQueryOptions<PaginatedResponse<Category>, Error>,\n 'queryKey' | 'queryFn'\n>;\n\ntype UseCategoryOptions = Omit<UseQueryOptions<Category, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Hook for fetching paginated categories\n *\n * @param params - Category query parameters\n * @param options - React Query options\n */\nexport const useCategories = (params?: CategoryParams, options?: UseCategoriesOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.categories.list(params),\n queryFn: () => client.categories.list(params),\n staleTime: 1000 * 60 * 60 * 24 * 7, // 1 week\n ...options,\n });\n};\n\n/**\n * Hook for infinite scrolling categories\n *\n * @param params - Base category query parameters\n */\nexport const useInfiniteCategories = (params?: Omit<CategoryParams, 'page'>) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useInfiniteQuery({\n queryKey: queryKeys.categories.lists(),\n queryFn: ({ pageParam = 1 }) =>\n client.categories.list({ ...params, page: pageParam as number }),\n initialPageParam: 1,\n getNextPageParam: (lastPage) =>\n lastPage.pagination.hasNextPage ? lastPage.pagination.nextPage : undefined,\n getPreviousPageParam: (firstPage) =>\n firstPage.pagination.hasPrevPage ? firstPage.pagination.prevPage : undefined,\n staleTime: 1000 * 60 * 60 * 24 * 7, // 1 week\n gcTime: 1000 * 60 * 60 * 24 * 30, // 30 days\n });\n};\n\n/**\n * Hook for fetching a single category by ID\n *\n * @param id - Category ID\n * @param options - React Query options\n */\nexport const useCategory = (id: number, options?: UseCategoryOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.categories.detail(id),\n queryFn: () => client.categories.get(id),\n staleTime: 1000 * 60 * 60 * 24 * 7, // 1 week\n enabled: id > 0,\n ...options,\n });\n};\n","/**\n * Media React Query hooks\n */\n\nimport type { Media } from '@atomic-solutions/wordpress-api-client';\nimport { useQuery, type UseQueryOptions } from '@tanstack/react-query';\n\nimport { useWordPressClient, useWordPressQueryKeys } from './useWordPressClient';\n\ntype UseMediaItemOptions = Omit<UseQueryOptions<Media, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Hook for fetching a single media item by ID\n *\n * @param id - Media item ID\n * @param options - React Query options\n */\nexport const useMediaItem = (id: number | undefined, options?: UseMediaItemOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.media.detail(id || 0),\n queryFn: () => client.media.get(id!),\n staleTime: 1000 * 60 * 60 * 24, // 1 day\n gcTime: 1000 * 60 * 60 * 24 * 7, // 1 week\n enabled: !!id && id > 0,\n ...options,\n });\n};\n","/**\n * Users React Query hooks\n */\n\nimport type { CurrentUser, User } from '@atomic-solutions/wordpress-api-client';\nimport { useQuery, type UseQueryOptions } from '@tanstack/react-query';\n\nimport { useWordPressClient, useWordPressQueryKeys } from './useWordPressClient';\n\ntype UseCurrentUserOptions = Omit<UseQueryOptions<CurrentUser, Error>, 'queryKey' | 'queryFn'>;\n\ntype UseUserOptions = Omit<UseQueryOptions<User, Error>, 'queryKey' | 'queryFn'>;\n\n/**\n * Hook for fetching current authenticated user\n *\n * Requires JWT token to be configured\n *\n * @param options - React Query options\n */\nexport const useCurrentUser = (options?: UseCurrentUserOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.users.me(),\n queryFn: () => client.users.me(),\n staleTime: 1000 * 60 * 5, // 5 minutes\n retry: false, // Don't retry auth failures\n ...options,\n });\n};\n\n/**\n * Hook for fetching a user by ID\n *\n * @param id - User ID\n * @param options - React Query options\n */\nexport const useUser = (id: number, options?: UseUserOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n\n return useQuery({\n queryKey: queryKeys.users.detail(id),\n queryFn: () => client.users.get(id),\n staleTime: 1000 * 60 * 60, // 1 hour\n enabled: id > 0,\n ...options,\n });\n};\n","/**\n * Auth React Query hooks\n */\n\nimport type { JwtLoginInput, JwtTokenResponse } from '@atomic-solutions/wordpress-api-client';\nimport { useMutation, useQueryClient, type UseMutationOptions } from '@tanstack/react-query';\n\nimport { useWordPressClient, useWordPressQueryKeys } from './useWordPressClient';\n\ntype UseLoginOptions = Omit<\n UseMutationOptions<JwtTokenResponse, Error, JwtLoginInput>,\n 'mutationFn'\n>;\n\n/**\n * Hook for logging in with username/password\n *\n * Returns JWT token on success\n *\n * @param options - React Query mutation options\n *\n * @example\n * ```tsx\n * const { mutate: login, isPending } = useLogin({\n * onSuccess: (data) => {\n * // Save token to storage\n * AsyncStorage.setItem('wp_jwt_token', data.token);\n * },\n * onError: (error) => {\n * // Handle login error\n * Alert.alert('Error', error.message);\n * },\n * });\n *\n * login({ username: 'user', password: 'pass' });\n * ```\n */\nexport const useLogin = (options?: UseLoginOptions) => {\n const client = useWordPressClient();\n const queryKeys = useWordPressQueryKeys();\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: (input: JwtLoginInput) => client.auth.login(input),\n onSuccess: () => {\n // Invalidate user queries after login\n queryClient.invalidateQueries({ queryKey: queryKeys.users.all });\n },\n ...options,\n });\n};\n\n/**\n * Hook for validating current JWT token\n *\n * @param options - React Query mutation options\n */\nexport const useValidateToken = (\n options?: Omit<UseMutationOptions<boolean, Error, void>, 'mutationFn'>\n) => {\n const client = useWordPressClient();\n\n return useMutation({\n mutationFn: () => client.auth.validateToken(),\n ...options,\n });\n};\n"],"mappings":"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","names":["queryKeys","useInfiniteQuery","useQuery","queryKeys","useQuery","useInfiniteQuery","useQuery","queryKeys","useQuery","useQuery","queryKeys","useQuery","queryKeys"]}
@@ -0,0 +1,23 @@
1
+ import {
2
+ WordPressContext
3
+ } from "./chunk-WEGZSYNS.js";
4
+
5
+ // src/provider/WordPressProvider.tsx
6
+ import { useMemo } from "react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ var WordPressProvider = ({
9
+ queryKeys,
10
+ children,
11
+ client
12
+ }) => {
13
+ const contextValue = useMemo(() => ({ client, queryKeys }), [client, queryKeys]);
14
+ if (!contextValue.client && !contextValue.queryKeys) {
15
+ return children;
16
+ }
17
+ return /* @__PURE__ */ jsx(WordPressContext.Provider, { value: contextValue, children });
18
+ };
19
+
20
+ export {
21
+ WordPressProvider
22
+ };
23
+ //# sourceMappingURL=chunk-S5XNF5RD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/WordPressProvider.tsx"],"sourcesContent":["/**\n * WordPress client provider\n */\n\nimport React, { useMemo, type ReactNode } from 'react';\nimport { type WordPressClient } from '@atomic-solutions/wordpress-api-client';\n\nimport type { QueryKeys } from '../hooks/queryKeys';\nimport { WordPressContext } from './WordPressContext';\n\n/**\n * Base props shared by both provider modes\n */\ninterface WordPressProviderBaseProps {\n /** Query keys instance created with createQueryKeys() */\n queryKeys: QueryKeys;\n\n /** Child components */\n children: ReactNode;\n}\n\n/**\n * Provider props when using config (provider creates client)\n */\ninterface WordPressProviderWithConfig extends WordPressProviderBaseProps {\n client: WordPressClient;\n}\n\n/**\n * WordPress provider props - either config OR client (mutually exclusive)\n */\nexport type WordPressProviderProps = WordPressProviderWithConfig;\n\n/**\n * Provider component for WordPress client and query keys\n *\n * @example\n * ```tsx\n * import { WordPressProvider, createQueryKeys } from '@atomic-solutions/react-wordpress';\n *\n * const queryKeys = createQueryKeys(['my-app']);\n * const client = createClient({ baseURL: '...' });\n * ```\n */\nexport const WordPressProvider: React.FC<WordPressProviderProps> = ({\n queryKeys,\n children,\n client,\n}) => {\n const contextValue = useMemo(() => ({ client, queryKeys }), [client, queryKeys]);\n\n if (!contextValue.client && !contextValue.queryKeys) {\n return children;\n }\n\n return <WordPressContext.Provider value={contextValue}>{children}</WordPressContext.Provider>;\n};\n"],"mappings":";;;;;AAIA,SAAgB,eAA+B;AAmDtC;AAXF,IAAM,oBAAsD,CAAC;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,eAAe,QAAQ,OAAO,EAAE,QAAQ,UAAU,IAAI,CAAC,QAAQ,SAAS,CAAC;AAE/E,MAAI,CAAC,aAAa,UAAU,CAAC,aAAa,WAAW;AACnD,WAAO;AAAA,EACT;AAEA,SAAO,oBAAC,iBAAiB,UAAjB,EAA0B,OAAO,cAAe,UAAS;AACnE;","names":[]}
@@ -0,0 +1,8 @@
1
+ // src/provider/WordPressContext.ts
2
+ import { createContext } from "react";
3
+ var WordPressContext = createContext(null);
4
+
5
+ export {
6
+ WordPressContext
7
+ };
8
+ //# sourceMappingURL=chunk-WEGZSYNS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/provider/WordPressContext.ts"],"sourcesContent":["/**\n * WordPress client context\n */\n\nimport { createContext } from 'react';\nimport type { WordPressClient } from '@atomic-solutions/wordpress-api-client';\n\nimport type { QueryKeys } from '../hooks/queryKeys';\n\n/**\n * WordPress context value\n */\nexport interface WordPressContextValue {\n client: WordPressClient;\n queryKeys: QueryKeys;\n}\n\n/**\n * React context for WordPress client and query keys\n */\nexport const WordPressContext = createContext<WordPressContextValue | null>(null);\n"],"mappings":";AAIA,SAAS,qBAAqB;AAgBvB,IAAM,mBAAmB,cAA4C,IAAI;","names":[]}