@wix/headless-instagram 0.0.1

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.
Files changed (64) hide show
  1. package/cjs/dist/react/InstagramFeed.d.ts +7 -0
  2. package/cjs/dist/react/InstagramFeed.js +6 -0
  3. package/cjs/dist/react/InstagramFeedRoot.d.ts +18 -0
  4. package/cjs/dist/react/InstagramFeedRoot.js +19 -0
  5. package/cjs/dist/react/InstagramMedia.d.ts +73 -0
  6. package/cjs/dist/react/InstagramMedia.js +71 -0
  7. package/cjs/dist/react/InstagramMedias.d.ts +10 -0
  8. package/cjs/dist/react/InstagramMedias.js +16 -0
  9. package/cjs/dist/react/UserName.d.ts +11 -0
  10. package/cjs/dist/react/UserName.js +8 -0
  11. package/cjs/dist/react/core/InstagramMedia.d.ts +82 -0
  12. package/cjs/dist/react/core/InstagramMedia.js +65 -0
  13. package/cjs/dist/react/core/InstagramMedias.d.ts +19 -0
  14. package/cjs/dist/react/core/InstagramMedias.js +54 -0
  15. package/cjs/dist/react/core/Root.d.ts +7 -0
  16. package/cjs/dist/react/core/Root.js +8 -0
  17. package/cjs/dist/react/core/UserName.d.ts +21 -0
  18. package/cjs/dist/react/core/UserName.js +17 -0
  19. package/cjs/dist/react/core/index.d.ts +4 -0
  20. package/cjs/dist/react/core/index.js +5 -0
  21. package/cjs/dist/react/index.d.ts +2 -0
  22. package/cjs/dist/react/index.js +2 -0
  23. package/cjs/dist/services/index.d.ts +2 -0
  24. package/cjs/dist/services/index.js +2 -0
  25. package/cjs/dist/services/instagram-feed-service.d.ts +178 -0
  26. package/cjs/dist/services/instagram-feed-service.js +196 -0
  27. package/cjs/dist/services/instagram-media-item-service.d.ts +73 -0
  28. package/cjs/dist/services/instagram-media-item-service.js +55 -0
  29. package/cjs/dist/vitest.setup.d.ts +1 -0
  30. package/cjs/dist/vitest.setup.js +1 -0
  31. package/cjs/package.json +3 -0
  32. package/dist/react/InstagramFeed.d.ts +7 -0
  33. package/dist/react/InstagramFeed.js +6 -0
  34. package/dist/react/InstagramFeedRoot.d.ts +18 -0
  35. package/dist/react/InstagramFeedRoot.js +19 -0
  36. package/dist/react/InstagramMedia.d.ts +73 -0
  37. package/dist/react/InstagramMedia.js +71 -0
  38. package/dist/react/InstagramMedias.d.ts +10 -0
  39. package/dist/react/InstagramMedias.js +16 -0
  40. package/dist/react/UserName.d.ts +11 -0
  41. package/dist/react/UserName.js +8 -0
  42. package/dist/react/core/InstagramMedia.d.ts +82 -0
  43. package/dist/react/core/InstagramMedia.js +65 -0
  44. package/dist/react/core/InstagramMedias.d.ts +19 -0
  45. package/dist/react/core/InstagramMedias.js +54 -0
  46. package/dist/react/core/Root.d.ts +7 -0
  47. package/dist/react/core/Root.js +8 -0
  48. package/dist/react/core/UserName.d.ts +21 -0
  49. package/dist/react/core/UserName.js +17 -0
  50. package/dist/react/core/index.d.ts +4 -0
  51. package/dist/react/core/index.js +5 -0
  52. package/dist/react/index.d.ts +2 -0
  53. package/dist/react/index.js +2 -0
  54. package/dist/services/index.d.ts +2 -0
  55. package/dist/services/index.js +2 -0
  56. package/dist/services/instagram-feed-service.d.ts +178 -0
  57. package/dist/services/instagram-feed-service.js +196 -0
  58. package/dist/services/instagram-media-item-service.d.ts +73 -0
  59. package/dist/services/instagram-media-item-service.js +55 -0
  60. package/dist/vitest.setup.d.ts +1 -0
  61. package/dist/vitest.setup.js +1 -0
  62. package/package.json +81 -0
  63. package/react/package.json +6 -0
  64. package/services/package.json +6 -0
@@ -0,0 +1,196 @@
1
+ import { defineService, implementService } from '@wix/services-definitions';
2
+ import { SignalsServiceDefinition, } from '@wix/services-definitions/core-services/signals';
3
+ import { accounts } from '@wix/instagram-account';
4
+ import { media } from '@wix/instagram-media';
5
+ /**
6
+ * Default Instagram feed data
7
+ */
8
+ const defaultInstagramFeedData = {
9
+ mediaItems: [],
10
+ hasMore: false,
11
+ };
12
+ /**
13
+ * Service definition for the Instagram Feed service.
14
+ * This defines the reactive API contract for managing Instagram feed data.
15
+ */
16
+ export const InstagramFeedServiceDefinition = defineService('instagram-feed');
17
+ /**
18
+ * Implementation of the Instagram Feed service that manages reactive Instagram feed data.
19
+ * This service provides signals for feed data, loading state, and error handling,
20
+ * along with methods to dynamically load and refresh Instagram content.
21
+ *
22
+ * @example
23
+ * ```tsx
24
+ * import { InstagramFeedService, InstagramFeedServiceDefinition } from '@wix/instagram/services';
25
+ * import { useService } from '@wix/services-manager-react';
26
+ *
27
+ * function InstagramComponent({ feedConfig }) {
28
+ * return (
29
+ * <ServiceProvider services={createServicesMap([
30
+ * [InstagramFeedServiceDefinition, InstagramFeedService.withConfig(feedConfig)]
31
+ * ])}>
32
+ * <InstagramDisplay />
33
+ * </ServiceProvider>
34
+ * );
35
+ * }
36
+ *
37
+ * function InstagramDisplay() {
38
+ * const feedService = useService(InstagramFeedServiceDefinition);
39
+ * const feedData = feedService.feedData.get();
40
+ * const isLoading = feedService.isLoading.get();
41
+ * const error = feedService.error.get();
42
+ *
43
+ * if (isLoading) return <div>Loading Instagram feed...</div>;
44
+ * if (error) return <div>Error: {error}</div>;
45
+ *
46
+ * return <div>{feedData.mediaItems.length} posts loaded</div>;
47
+ * }
48
+ * ```
49
+ */
50
+ export const InstagramFeedService = implementService.withConfig()(InstagramFeedServiceDefinition, ({ getService, config }) => {
51
+ const signalsService = getService(SignalsServiceDefinition);
52
+ const feedData = signalsService.signal(config.feedData || defaultInstagramFeedData);
53
+ const isLoading = signalsService.signal(!!config.accountId);
54
+ const error = signalsService.signal(null);
55
+ const loadFeed = async (accountId, cursor) => {
56
+ try {
57
+ isLoading.set(true);
58
+ error.set(null);
59
+ // Load Instagram account information
60
+ const accountResponse = await accounts.getInstagramAccount(accountId);
61
+ // Load Instagram media for the account
62
+ const mediaResponse = await media.listInstagramAccountMedia(accountId);
63
+ // Transform SDK media to our interface format
64
+ const transformedMedia = mediaResponse.media?.map((mediaItem) => ({
65
+ id: mediaItem._id || mediaItem.mediaId || '',
66
+ type: (mediaItem.mediaType || 'image'),
67
+ mediaUrl: mediaItem.mediaUrl || '',
68
+ thumbnailUrl: mediaItem.thumbnailUrl || undefined,
69
+ caption: mediaItem.caption,
70
+ permalink: mediaItem.permalink || '',
71
+ timestamp: typeof mediaItem.timestamp === 'string'
72
+ ? mediaItem.timestamp
73
+ : new Date().toISOString(),
74
+ altText: mediaItem.caption ||
75
+ `Instagram post ${mediaItem._id || mediaItem.mediaId}`,
76
+ })) || [];
77
+ const newFeedData = {
78
+ account: accountResponse,
79
+ mediaItems: cursor
80
+ ? [...feedData.get().mediaItems, ...transformedMedia]
81
+ : transformedMedia,
82
+ hasMore: false, // Note: Real pagination logic would depend on actual SDK response structure
83
+ nextCursor: undefined,
84
+ };
85
+ feedData.set(newFeedData);
86
+ }
87
+ catch (err) {
88
+ const errorMessage = err instanceof Error
89
+ ? err.message
90
+ : 'Failed to load Instagram feed';
91
+ error.set(errorMessage);
92
+ }
93
+ finally {
94
+ isLoading.set(false);
95
+ }
96
+ };
97
+ const loadMore = async () => {
98
+ const currentData = feedData.get();
99
+ if (!currentData.hasMore || isLoading.get())
100
+ return;
101
+ if (config.accountId) {
102
+ await loadFeed(config.accountId, currentData.nextCursor);
103
+ }
104
+ };
105
+ const refresh = async () => {
106
+ if (config.accountId) {
107
+ await loadFeed(config.accountId);
108
+ }
109
+ };
110
+ // Initial load if accountId is provided
111
+ if (config.accountId && !config.feedData) {
112
+ loadFeed(config.accountId);
113
+ }
114
+ return {
115
+ feedData,
116
+ isLoading,
117
+ error,
118
+ loadMore,
119
+ refresh,
120
+ };
121
+ });
122
+ /**
123
+ * Input object for loading Instagram feed service configuration
124
+ */
125
+ /**
126
+ * Loads Instagram feed service configuration from the Wix Instagram API for SSR initialization.
127
+ * This function is designed to be used during Server-Side Rendering (SSR) to preload
128
+ * Instagram feed data that will be used to configure the InstagramFeedService.
129
+ *
130
+ * @param input InstagramFeedServiceConfig object containing accountId and optional limit
131
+ * @returns Promise that resolves to InstagramFeedServiceConfigResult (success with config or notFound)
132
+ *
133
+ * @example
134
+ * ```tsx
135
+ * import { loadInstagramFeedServiceConfig } from '@wix/instagram/services';
136
+ *
137
+ * // In your SSR handler or server action
138
+ * const configResult = await loadInstagramFeedServiceConfig({
139
+ * accountId: 'instagram_account_123',
140
+ * limit: 12
141
+ * });
142
+ *
143
+ * if (configResult.type === 'success') {
144
+ * // Use configResult.config to initialize InstagramFeedService
145
+ * return configResult.config;
146
+ * } else {
147
+ * // Handle not found case
148
+ * return { accountId: 'instagram_account_123' }; // fallback config
149
+ * }
150
+ * ```
151
+ */
152
+ export async function loadInstagramFeedServiceConfig(input) {
153
+ try {
154
+ const { accountId, limit } = input;
155
+ if (!accountId) {
156
+ return { type: 'notFound' };
157
+ }
158
+ // Load Instagram account information using SDK
159
+ const accountResponse = await accounts.getInstagramAccount(accountId);
160
+ if (!accountResponse) {
161
+ return { type: 'notFound' };
162
+ }
163
+ // Load initial media items using SDK
164
+ const mediaResponse = await media.listInstagramAccountMedia(accountId);
165
+ // Transform SDK media to our interface format
166
+ const transformedMedia = mediaResponse.media?.map((mediaItem) => ({
167
+ id: mediaItem._id || mediaItem.mediaId || '',
168
+ type: (mediaItem.mediaType || 'image'),
169
+ mediaUrl: mediaItem.mediaUrl || '',
170
+ thumbnailUrl: mediaItem.thumbnailUrl || undefined,
171
+ caption: mediaItem.caption,
172
+ permalink: mediaItem.permalink || '',
173
+ timestamp: typeof mediaItem.timestamp === 'string'
174
+ ? mediaItem.timestamp
175
+ : new Date().toISOString(),
176
+ altText: mediaItem.caption ||
177
+ `Instagram post ${mediaItem._id || mediaItem.mediaId}`,
178
+ })) || [];
179
+ const feedData = {
180
+ account: accountResponse,
181
+ mediaItems: transformedMedia,
182
+ hasMore: false, // Note: Real pagination logic would depend on actual SDK response structure
183
+ nextCursor: undefined,
184
+ };
185
+ const config = {
186
+ accountId,
187
+ limit,
188
+ feedData,
189
+ };
190
+ return { type: 'success', config };
191
+ }
192
+ catch (error) {
193
+ console.error('Failed to load Instagram feed config:', error);
194
+ return { type: 'notFound' };
195
+ }
196
+ }
@@ -0,0 +1,73 @@
1
+ import { type Signal } from '@wix/services-definitions/core-services/signals';
2
+ import type { InstagramMediaItem } from './instagram-feed-service.js';
3
+ /**
4
+ * API interface for Instagram Media Item service
5
+ */
6
+ export interface InstagramMediaItemServiceAPI {
7
+ /** Reactive signal containing the media item data */
8
+ mediaItem: Signal<InstagramMediaItem>;
9
+ /** Reactive signal containing the media item index */
10
+ index: Signal<number>;
11
+ }
12
+ /**
13
+ * Configuration for Instagram Media Item service
14
+ */
15
+ export interface InstagramMediaItemServiceConfig {
16
+ /** The Instagram media item data */
17
+ mediaItem: InstagramMediaItem;
18
+ /** The index of this media item in the gallery */
19
+ index: number;
20
+ }
21
+ /**
22
+ * Service definition for Instagram Media Item
23
+ */
24
+ export declare const InstagramMediaItemServiceDefinition: string & {
25
+ __api: InstagramMediaItemServiceAPI;
26
+ __config: {};
27
+ isServiceDefinition?: boolean;
28
+ } & InstagramMediaItemServiceAPI;
29
+ /**
30
+ * Implementation of the Instagram Media Item service that manages reactive media item data.
31
+ * This service provides signals for individual media item data and its index position.
32
+ * Used by gallery components to access media item information in a service-based architecture.
33
+ *
34
+ * @example
35
+ * ```tsx
36
+ * import { InstagramMediaItemService, InstagramMediaItemServiceDefinition } from '@wix/headless-instagram/services';
37
+ * import { useService } from '@wix/services-manager-react';
38
+ * import { WixServices, createServicesMap } from '@wix/services-manager';
39
+ *
40
+ * function MediaItemComponent({ mediaItem, index }) {
41
+ * return (
42
+ * <WixServices
43
+ * servicesMap={createServicesMap().addService(
44
+ * InstagramMediaItemServiceDefinition,
45
+ * InstagramMediaItemService,
46
+ * { mediaItem, index }
47
+ * )}
48
+ * >
49
+ * <MediaItemDisplay />
50
+ * </WixServices>
51
+ * );
52
+ * }
53
+ *
54
+ * function MediaItemDisplay() {
55
+ * const mediaItemService = useService(InstagramMediaItemServiceDefinition);
56
+ * const mediaItem = mediaItemService.mediaItem.get();
57
+ * const index = mediaItemService.index.get();
58
+ *
59
+ * return (
60
+ * <div>
61
+ * <img src={mediaItem.mediaUrl} alt={mediaItem.altText} />
62
+ * <span>Item {index + 1}</span>
63
+ * {mediaItem.type === 'video' && <VideoIndicator />}
64
+ * </div>
65
+ * );
66
+ * }
67
+ * ```
68
+ */
69
+ export declare const InstagramMediaItemService: import("@wix/services-definitions").ServiceFactory<string & {
70
+ __api: InstagramMediaItemServiceAPI;
71
+ __config: {};
72
+ isServiceDefinition?: boolean;
73
+ } & InstagramMediaItemServiceAPI, InstagramMediaItemServiceConfig>;
@@ -0,0 +1,55 @@
1
+ import { defineService, implementService } from '@wix/services-definitions';
2
+ import { SignalsServiceDefinition, } from '@wix/services-definitions/core-services/signals';
3
+ /**
4
+ * Service definition for Instagram Media Item
5
+ */
6
+ export const InstagramMediaItemServiceDefinition = defineService('instagramMediaItem');
7
+ /**
8
+ * Implementation of the Instagram Media Item service that manages reactive media item data.
9
+ * This service provides signals for individual media item data and its index position.
10
+ * Used by gallery components to access media item information in a service-based architecture.
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * import { InstagramMediaItemService, InstagramMediaItemServiceDefinition } from '@wix/headless-instagram/services';
15
+ * import { useService } from '@wix/services-manager-react';
16
+ * import { WixServices, createServicesMap } from '@wix/services-manager';
17
+ *
18
+ * function MediaItemComponent({ mediaItem, index }) {
19
+ * return (
20
+ * <WixServices
21
+ * servicesMap={createServicesMap().addService(
22
+ * InstagramMediaItemServiceDefinition,
23
+ * InstagramMediaItemService,
24
+ * { mediaItem, index }
25
+ * )}
26
+ * >
27
+ * <MediaItemDisplay />
28
+ * </WixServices>
29
+ * );
30
+ * }
31
+ *
32
+ * function MediaItemDisplay() {
33
+ * const mediaItemService = useService(InstagramMediaItemServiceDefinition);
34
+ * const mediaItem = mediaItemService.mediaItem.get();
35
+ * const index = mediaItemService.index.get();
36
+ *
37
+ * return (
38
+ * <div>
39
+ * <img src={mediaItem.mediaUrl} alt={mediaItem.altText} />
40
+ * <span>Item {index + 1}</span>
41
+ * {mediaItem.type === 'video' && <VideoIndicator />}
42
+ * </div>
43
+ * );
44
+ * }
45
+ * ```
46
+ */
47
+ export const InstagramMediaItemService = implementService.withConfig()(InstagramMediaItemServiceDefinition, ({ getService, config }) => {
48
+ const signalsService = getService(SignalsServiceDefinition);
49
+ const mediaItem = signalsService.signal(config.mediaItem);
50
+ const index = signalsService.signal(config.index);
51
+ return {
52
+ mediaItem,
53
+ index,
54
+ };
55
+ });
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/vitest';
@@ -0,0 +1 @@
1
+ import '@testing-library/jest-dom/vitest';
package/package.json ADDED
@@ -0,0 +1,81 @@
1
+ {
2
+ "name": "@wix/headless-instagram",
3
+ "version": "0.0.1",
4
+ "description": "Headless components for Wix Instagram integration",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/wix/headless-components.git",
10
+ "directory": "packages/headless-components/instagram"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/wix/headless-components/issues"
14
+ },
15
+ "homepage": "https://github.com/wix/headless-components#readme",
16
+ "keywords": [
17
+ "wix",
18
+ "headless",
19
+ "instagram",
20
+ "react",
21
+ "components"
22
+ ],
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "scripts": {
27
+ "build": "npm run build:esm && npm run build:cjs",
28
+ "build:esm": "tsc -p tsconfig.json",
29
+ "build:cjs": "tsc -p tsconfig.cjs.json",
30
+ "test": "vitest --run",
31
+ "lint:fix": "prettier --write \"src/**/*.{ts,tsx,js,jsx,json,md}\"",
32
+ "lint:check": "prettier --check \"src/**/*.{ts,tsx,js,jsx,json,md}\""
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "cjs",
37
+ "react",
38
+ "services"
39
+ ],
40
+ "exports": {
41
+ "./react": {
42
+ "types": "./dist/react/index.d.ts",
43
+ "import": "./dist/react/index.js",
44
+ "require": "./cjs/dist/react/index.js"
45
+ },
46
+ "./core": {
47
+ "types": "./dist/react/core/index.d.ts",
48
+ "import": "./dist/react/core/index.js",
49
+ "require": "./cjs/dist/react/core/index.js"
50
+ },
51
+ "./services": {
52
+ "types": "./dist/services/index.d.ts",
53
+ "import": "./dist/services/index.js",
54
+ "require": "./cjs/dist/services/index.js"
55
+ }
56
+ },
57
+ "devDependencies": {
58
+ "@testing-library/dom": "^10.4.0",
59
+ "@testing-library/jest-dom": "^6.6.3",
60
+ "@testing-library/react": "^16.3.0",
61
+ "@types/node": "^20.9.0",
62
+ "@vitest/ui": "^3.1.4",
63
+ "jsdom": "^26.1.0",
64
+ "prettier": "^3.4.2",
65
+ "typescript": "^5.8.3",
66
+ "vitest": "^3.1.4"
67
+ },
68
+ "dependencies": {
69
+ "@radix-ui/react-slot": "^1.2.3",
70
+ "@wix/essentials": "^0.1.24",
71
+ "@wix/headless-media": "workspace:*",
72
+ "@wix/headless-utils": "workspace:*",
73
+ "@wix/instagram-account": "^1.0.16",
74
+ "@wix/instagram-media": "^1.0.13",
75
+ "@wix/services-definitions": "^0.1.4",
76
+ "@wix/services-manager-react": "^0.1.26"
77
+ },
78
+ "peerDependencies": {
79
+ "@wix/headless-components": "workspace:*"
80
+ }
81
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@wix/headless-instagram-react",
3
+ "main": "../cjs/dist/react/index.js",
4
+ "module": "../dist/react/index.js",
5
+ "types": "../dist/react/index.d.ts"
6
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "name": "@wix/headless-instagram-services",
3
+ "main": "../cjs/dist/services/index.js",
4
+ "module": "../dist/services/index.js",
5
+ "types": "../dist/services/index.d.ts"
6
+ }