@marvalt/shcoder 0.1.0 → 0.1.2

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.
@@ -11,7 +11,7 @@ export interface MemberCardProps extends ShortcodeAttributes {
11
11
  }
12
12
  /**
13
13
  * MemberCard component - displays a single member profile
14
- * Usage: [member_card id="123"]
14
+ * Usage: [member_card id="123"] or [member_card] with ?member_id=123 in URL
15
15
  */
16
16
  export declare const MemberCard: React.FC<MemberCardProps>;
17
17
  //# sourceMappingURL=MemberCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"MemberCard.d.ts","sourceRoot":"","sources":["../../src/components/MemberCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAyChD,CAAC"}
1
+ {"version":3,"file":"MemberCard.d.ts","sourceRoot":"","sources":["../../src/components/MemberCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE3D,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IAC1D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CA6ChD,CAAC"}
@@ -11,7 +11,7 @@ export interface TestimonialCardProps extends ShortcodeAttributes {
11
11
  }
12
12
  /**
13
13
  * TestimonialCard component - displays a single testimonial
14
- * Usage: [testimonial_card id="123"]
14
+ * Usage: [testimonial_card id="123"] or [testimonial_card] with ?testimonial_id=123 in URL
15
15
  */
16
16
  export declare const TestimonialCard: React.FC<TestimonialCardProps>;
17
17
  //# sourceMappingURL=TestimonialCard.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"TestimonialCard.d.ts","sourceRoot":"","sources":["../../src/components/TestimonialCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAqC1D,CAAC"}
1
+ {"version":3,"file":"TestimonialCard.d.ts","sourceRoot":"","sources":["../../src/components/TestimonialCard.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,KAAK,CAAC,EAAE,CAAC,oBAAoB,CAyC1D,CAAC"}
@@ -7,6 +7,18 @@
7
7
  import type { Member } from '../types/member';
8
8
  import type { ShortcodeAttributes } from '../types/shortcode';
9
9
  export declare function setWordPressApiUrl(url: string): void;
10
+ type StaticDataProvider = () => {
11
+ members: any[];
12
+ getMemberById: (id: string | number) => any | null;
13
+ filterMembers: (filters: {
14
+ category?: string;
15
+ role?: string;
16
+ limit?: number;
17
+ orderby?: string;
18
+ order?: string;
19
+ }) => any[];
20
+ };
21
+ export declare function setStaticDataProvider(provider: StaticDataProvider): void;
10
22
  /**
11
23
  * Hook to fetch members based on shortcode attributes
12
24
  */
@@ -23,4 +35,5 @@ export declare function useMember(id: string | number): {
23
35
  loading: boolean;
24
36
  error: Error | null;
25
37
  };
38
+ export {};
26
39
  //# sourceMappingURL=useMembers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useMembers.d.ts","sourceRoot":"","sources":["../../src/hooks/useMembers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAS9D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,QAE7C;AAyBD;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,mBAAmB;;;;EAsGpD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;;;;EAwE5C"}
1
+ {"version":3,"file":"useMembers.d.ts","sourceRoot":"","sources":["../../src/hooks/useMembers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAS9D,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,QAE7C;AA0BD,KAAK,kBAAkB,GAAG,MAAM;IAC9B,OAAO,EAAE,GAAG,EAAE,CAAC;IACf,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,KAAK,GAAG,GAAG,IAAI,CAAC;IACnD,aAAa,EAAE,CAAC,OAAO,EAAE;QACvB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,KAAK,GAAG,EAAE,CAAC;CACb,CAAC;AAIF,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,QAEjE;AAqCD;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,mBAAmB;;;;EAwGpD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM;;;;EA0E5C"}
package/dist/index.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var require$$0 = require('react');
4
+ var reactRouterDom = require('react-router-dom');
4
5
 
5
6
  /**
6
7
  * @license GPL-3.0-or-later
@@ -36,6 +37,42 @@ function getApiUrl$1() {
36
37
  }
37
38
  // Initialize API URL
38
39
  apiUrl$1 = getApiUrl$1();
40
+ let staticDataProvider = null;
41
+ function setStaticDataProvider(provider) {
42
+ staticDataProvider = provider;
43
+ }
44
+ // Helper function to extract featured image from member data
45
+ function extractFeaturedImage(member) {
46
+ if (member.featured_image_urls) {
47
+ return member.featured_image_urls;
48
+ }
49
+ if (member._embedded?.['wp:featuredmedia']?.[0]) {
50
+ const featuredMedia = member._embedded['wp:featuredmedia'][0];
51
+ return {
52
+ thumbnail: featuredMedia.media_details?.sizes?.thumbnail ? {
53
+ url: featuredMedia.media_details.sizes.thumbnail.source_url,
54
+ width: featuredMedia.media_details.sizes.thumbnail.width,
55
+ height: featuredMedia.media_details.sizes.thumbnail.height,
56
+ } : undefined,
57
+ medium: featuredMedia.media_details?.sizes?.medium ? {
58
+ url: featuredMedia.media_details.sizes.medium.source_url,
59
+ width: featuredMedia.media_details.sizes.medium.width,
60
+ height: featuredMedia.media_details.sizes.medium.height,
61
+ } : undefined,
62
+ large: featuredMedia.media_details?.sizes?.large ? {
63
+ url: featuredMedia.media_details.sizes.large.source_url,
64
+ width: featuredMedia.media_details.sizes.large.width,
65
+ height: featuredMedia.media_details.sizes.large.height,
66
+ } : undefined,
67
+ full: {
68
+ url: featuredMedia.source_url || featuredMedia.media_details?.sizes?.full?.source_url || '',
69
+ width: featuredMedia.media_details?.width || 0,
70
+ height: featuredMedia.media_details?.height || 0,
71
+ },
72
+ };
73
+ }
74
+ return undefined;
75
+ }
39
76
  /**
40
77
  * Hook to fetch members based on shortcode attributes
41
78
  */
@@ -44,15 +81,39 @@ function useMembers(attrs) {
44
81
  const [loading, setLoading] = require$$0.useState(true);
45
82
  const [error, setError] = require$$0.useState(null);
46
83
  require$$0.useEffect(() => {
47
- if (!apiUrl$1) {
48
- setError(new Error('WordPress API URL not configured'));
49
- setLoading(false);
50
- return;
51
- }
52
84
  async function fetchMembers() {
53
85
  try {
54
86
  setLoading(true);
55
87
  setError(null);
88
+ // Use static data if available (preferred method)
89
+ if (staticDataProvider) {
90
+ const provider = staticDataProvider();
91
+ const filtered = provider.filterMembers({
92
+ category: attrs.tax || attrs.category,
93
+ role: attrs.role,
94
+ limit: attrs.limit ? parseInt(attrs.limit, 10) : undefined,
95
+ orderby: attrs.orderby || 'date',
96
+ order: attrs.order || 'desc',
97
+ });
98
+ // Process members to match Member interface
99
+ const processedMembers = filtered.map((member) => {
100
+ const processed = {
101
+ ...member,
102
+ member_meta: member.member_meta || {},
103
+ featured_image_urls: extractFeaturedImage(member),
104
+ };
105
+ return processed;
106
+ });
107
+ setMembers(processedMembers);
108
+ setLoading(false);
109
+ return;
110
+ }
111
+ // Fallback to API (should not happen in production with static data)
112
+ if (!apiUrl$1) {
113
+ setError(new Error('WordPress API URL not configured and no static data provider available'));
114
+ setLoading(false);
115
+ return;
116
+ }
56
117
  // Build query params from shortcode attributes
57
118
  const params = {
58
119
  per_page: (attrs.limit ? parseInt(attrs.limit, 10) : 100).toString(),
@@ -85,33 +146,8 @@ function useMembers(attrs) {
85
146
  const processed = {
86
147
  ...member,
87
148
  member_meta: member.member_meta || {},
149
+ featured_image_urls: extractFeaturedImage(member),
88
150
  };
89
- // Extract featured image from _embedded
90
- if (member._embedded && member._embedded['wp:featuredmedia'] && member._embedded['wp:featuredmedia'][0]) {
91
- const featuredMedia = member._embedded['wp:featuredmedia'][0];
92
- processed.featured_image_urls = {
93
- thumbnail: featuredMedia.media_details?.sizes?.thumbnail ? {
94
- url: featuredMedia.media_details.sizes.thumbnail.source_url,
95
- width: featuredMedia.media_details.sizes.thumbnail.width,
96
- height: featuredMedia.media_details.sizes.thumbnail.height,
97
- } : undefined,
98
- medium: featuredMedia.media_details?.sizes?.medium ? {
99
- url: featuredMedia.media_details.sizes.medium.source_url,
100
- width: featuredMedia.media_details.sizes.medium.width,
101
- height: featuredMedia.media_details.sizes.medium.height,
102
- } : undefined,
103
- large: featuredMedia.media_details?.sizes?.large ? {
104
- url: featuredMedia.media_details.sizes.large.source_url,
105
- width: featuredMedia.media_details.sizes.large.width,
106
- height: featuredMedia.media_details.sizes.large.height,
107
- } : undefined,
108
- full: {
109
- url: featuredMedia.source_url || featuredMedia.media_details?.sizes?.full?.source_url || '',
110
- width: featuredMedia.media_details?.width || 0,
111
- height: featuredMedia.media_details?.height || 0,
112
- },
113
- };
114
- }
115
151
  return processed;
116
152
  });
117
153
  setMembers(processedMembers);
@@ -136,7 +172,7 @@ function useMember(id) {
136
172
  const [loading, setLoading] = require$$0.useState(true);
137
173
  const [error, setError] = require$$0.useState(null);
138
174
  require$$0.useEffect(() => {
139
- if (!apiUrl$1 || !id) {
175
+ if (!id) {
140
176
  setLoading(false);
141
177
  return;
142
178
  }
@@ -144,6 +180,31 @@ function useMember(id) {
144
180
  try {
145
181
  setLoading(true);
146
182
  setError(null);
183
+ // Use static data if available (preferred method)
184
+ if (staticDataProvider) {
185
+ const provider = staticDataProvider();
186
+ const found = provider.getMemberById(id);
187
+ if (found) {
188
+ // Process member to match Member interface
189
+ const processed = {
190
+ ...found,
191
+ member_meta: found.member_meta || {},
192
+ featured_image_urls: extractFeaturedImage(found),
193
+ };
194
+ setMember(processed);
195
+ }
196
+ else {
197
+ setMember(null);
198
+ }
199
+ setLoading(false);
200
+ return;
201
+ }
202
+ // Fallback to API (should not happen in production with static data)
203
+ if (!apiUrl$1) {
204
+ setError(new Error('WordPress API URL not configured and no static data provider available'));
205
+ setLoading(false);
206
+ return;
207
+ }
147
208
  const response = await fetch(`${apiUrl$1}/wp/v2/member/${id}?_embed=true`);
148
209
  if (!response.ok) {
149
210
  throw new Error(`Failed to fetch member: ${response.statusText}`);
@@ -153,33 +214,8 @@ function useMember(id) {
153
214
  const processed = {
154
215
  ...data,
155
216
  member_meta: data.member_meta || {},
217
+ featured_image_urls: extractFeaturedImage(data),
156
218
  };
157
- // Extract featured image from _embedded
158
- if (data._embedded && data._embedded['wp:featuredmedia'] && data._embedded['wp:featuredmedia'][0]) {
159
- const featuredMedia = data._embedded['wp:featuredmedia'][0];
160
- processed.featured_image_urls = {
161
- thumbnail: featuredMedia.media_details?.sizes?.thumbnail ? {
162
- url: featuredMedia.media_details.sizes.thumbnail.source_url,
163
- width: featuredMedia.media_details.sizes.thumbnail.width,
164
- height: featuredMedia.media_details.sizes.thumbnail.height,
165
- } : undefined,
166
- medium: featuredMedia.media_details?.sizes?.medium ? {
167
- url: featuredMedia.media_details.sizes.medium.source_url,
168
- width: featuredMedia.media_details.sizes.medium.width,
169
- height: featuredMedia.media_details.sizes.medium.height,
170
- } : undefined,
171
- large: featuredMedia.media_details?.sizes?.large ? {
172
- url: featuredMedia.media_details.sizes.large.source_url,
173
- width: featuredMedia.media_details.sizes.large.width,
174
- height: featuredMedia.media_details.sizes.large.height,
175
- } : undefined,
176
- full: {
177
- url: featuredMedia.source_url || featuredMedia.media_details?.sizes?.full?.source_url || '',
178
- width: featuredMedia.media_details?.width || 0,
179
- height: featuredMedia.media_details?.height || 0,
180
- },
181
- };
182
- }
183
219
  setMember(processed);
184
220
  }
185
221
  catch (err) {
@@ -1687,10 +1723,13 @@ var jsxRuntimeExports = jsxRuntime.exports;
1687
1723
 
1688
1724
  /**
1689
1725
  * MemberCard component - displays a single member profile
1690
- * Usage: [member_card id="123"]
1726
+ * Usage: [member_card id="123"] or [member_card] with ?member_id=123 in URL
1691
1727
  */
1692
1728
  const MemberCard = ({ id, className = '' }) => {
1693
- const { member, loading, error } = useMember(id || '');
1729
+ // Read from query params as fallback if id not provided in shortcode
1730
+ const [searchParams] = reactRouterDom.useSearchParams();
1731
+ const memberId = id || searchParams.get('member_id') || '';
1732
+ const { member, loading, error } = useMember(memberId);
1694
1733
  if (loading) {
1695
1734
  return jsxRuntimeExports.jsx("div", { className: `member-card-loading ${className}`, children: "Loading member..." });
1696
1735
  }
@@ -1788,10 +1827,13 @@ const MemberSlideshow = ({ tax, category, role, limit = '5', interval = '5000',
1788
1827
 
1789
1828
  /**
1790
1829
  * TestimonialCard component - displays a single testimonial
1791
- * Usage: [testimonial_card id="123"]
1830
+ * Usage: [testimonial_card id="123"] or [testimonial_card] with ?testimonial_id=123 in URL
1792
1831
  */
1793
1832
  const TestimonialCard = ({ id, className = '' }) => {
1794
- const { testimonial, loading, error } = useTestimonial(id || '');
1833
+ // Read from query params as fallback if id not provided in shortcode
1834
+ const [searchParams] = reactRouterDom.useSearchParams();
1835
+ const testimonialId = id || searchParams.get('testimonial_id') || '';
1836
+ const { testimonial, loading, error } = useTestimonial(testimonialId);
1795
1837
  if (loading) {
1796
1838
  return jsxRuntimeExports.jsx("div", { className: `testimonial-card-loading ${className}`, children: "Loading testimonial..." });
1797
1839
  }
@@ -1879,6 +1921,7 @@ exports.MemberSlideshow = MemberSlideshow;
1879
1921
  exports.TestimonialCard = TestimonialCard;
1880
1922
  exports.TestimonialCardsGrid = TestimonialCardsGrid;
1881
1923
  exports.TestimonialSlideshow = TestimonialSlideshow;
1924
+ exports.setStaticDataProvider = setStaticDataProvider;
1882
1925
  exports.setWordPressApiUrl = setWordPressApiUrl;
1883
1926
  exports.useMember = useMember;
1884
1927
  exports.useMembers = useMembers;