@burdenoff/microfe-store 2026.510.113
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/README.md +217 -0
- package/dist/StoreAdminRoot.d.ts +22 -0
- package/dist/StoreAdminRoot.js +23 -0
- package/dist/StoreAdminRoot.js.map +1 -0
- package/dist/StoreAdminRoutes.d.ts +9 -0
- package/dist/StoreAdminRoutes.js +69 -0
- package/dist/StoreAdminRoutes.js.map +1 -0
- package/dist/StoreRoot.d.ts +31 -0
- package/dist/StoreRoot.js +139 -0
- package/dist/StoreRoot.js.map +1 -0
- package/dist/StoreRoutes.d.ts +12 -0
- package/dist/StoreRoutes.js +285 -0
- package/dist/StoreRoutes.js.map +1 -0
- package/dist/components/InstallAppModal.d.ts +26 -0
- package/dist/components/InstallAppModal.js +287 -0
- package/dist/components/InstallAppModal.js.map +1 -0
- package/dist/components/RouteGuards.d.ts +17 -0
- package/dist/components/RouteGuards.js +26 -0
- package/dist/components/RouteGuards.js.map +1 -0
- package/dist/components/cart/CartDrawer.d.ts +35 -0
- package/dist/components/cart/CartDrawer.js +162 -0
- package/dist/components/cart/CartDrawer.js.map +1 -0
- package/dist/components/index.d.ts +9 -0
- package/dist/components/index.js +3 -0
- package/dist/components/marketplace/ProductCard.d.ts +18 -0
- package/dist/components/marketplace/ProductCard.js +2 -0
- package/dist/dev/main.d.ts +1 -0
- package/dist/generated/global-operations.d.ts +2012 -0
- package/dist/generated/global-operations.js +1444 -0
- package/dist/generated/global-operations.js.map +1 -0
- package/dist/generated/global-types.d.ts +20856 -0
- package/dist/generated/global-types.js +14 -0
- package/dist/generated/global-types.js.map +1 -0
- package/dist/generated/wspace-operations.d.ts +1 -0
- package/dist/generated/wspace-types.d.ts +53362 -0
- package/dist/hooks/index.d.ts +12 -0
- package/dist/hooks/useBackendCart.d.ts +73 -0
- package/dist/hooks/useBackendCart.js +171 -0
- package/dist/hooks/useBackendCart.js.map +1 -0
- package/dist/hooks/useCart.d.ts +62 -0
- package/dist/hooks/useCart.js +90 -0
- package/dist/hooks/useCart.js.map +1 -0
- package/dist/hooks/useInstallations.d.ts +43 -0
- package/dist/hooks/useInstallations.js +140 -0
- package/dist/hooks/useInstallations.js.map +1 -0
- package/dist/hooks/useOrders.d.ts +40 -0
- package/dist/hooks/useOrders.js +73 -0
- package/dist/hooks/useOrders.js.map +1 -0
- package/dist/hooks/useProductSearch.d.ts +22 -0
- package/dist/hooks/useProductSearch.js +59 -0
- package/dist/hooks/useProductSearch.js.map +1 -0
- package/dist/hooks/useStoreGraphQL.d.ts +475 -0
- package/dist/hooks/useStoreGraphQL.js +751 -0
- package/dist/hooks/useStoreGraphQL.js.map +1 -0
- package/dist/hooks/useStoreGraphQLWithContext.d.ts +48 -0
- package/dist/hooks/useStoreGraphQLWithContext.js +39 -0
- package/dist/hooks/useStoreGraphQLWithContext.js.map +1 -0
- package/dist/hooks/useStorePermissions.d.ts +63 -0
- package/dist/hooks/useStorePermissions.js +88 -0
- package/dist/hooks/useStorePermissions.js.map +1 -0
- package/dist/index.d.ts +44 -0
- package/dist/index.js +13 -0
- package/dist/pages/AdminDashboardPage.d.ts +3 -0
- package/dist/pages/AdminDashboardPage.js +491 -0
- package/dist/pages/AdminDashboardPage.js.map +1 -0
- package/dist/pages/AdminReviewModerationPage.d.ts +3 -0
- package/dist/pages/AdminReviewModerationPage.js +247 -0
- package/dist/pages/AdminReviewModerationPage.js.map +1 -0
- package/dist/pages/AdminStoresPage.d.ts +3 -0
- package/dist/pages/AdminStoresPage.js +442 -0
- package/dist/pages/AdminStoresPage.js.map +1 -0
- package/dist/pages/AdminSubmissionsQueuePage.d.ts +3 -0
- package/dist/pages/AdminSubmissionsQueuePage.js +387 -0
- package/dist/pages/AdminSubmissionsQueuePage.js.map +1 -0
- package/dist/pages/AppDetailPage.d.ts +3 -0
- package/dist/pages/AppDetailPage.js +166 -0
- package/dist/pages/AppDetailPage.js.map +1 -0
- package/dist/pages/AppSettingsPage.d.ts +3 -0
- package/dist/pages/AppSettingsPage.js +100 -0
- package/dist/pages/AppSettingsPage.js.map +1 -0
- package/dist/pages/CartPage.d.ts +8 -0
- package/dist/pages/CartPage.js +259 -0
- package/dist/pages/CartPage.js.map +1 -0
- package/dist/pages/InstalledAppsPage.d.ts +8 -0
- package/dist/pages/InstalledAppsPage.js +290 -0
- package/dist/pages/InstalledAppsPage.js.map +1 -0
- package/dist/pages/MarketplaceHomePage.d.ts +3 -0
- package/dist/pages/MarketplaceHomePage.js +1118 -0
- package/dist/pages/MarketplaceHomePage.js.map +1 -0
- package/dist/pages/MyLicensesPage.d.ts +3 -0
- package/dist/pages/MyLicensesPage.js +146 -0
- package/dist/pages/MyLicensesPage.js.map +1 -0
- package/dist/pages/OrderConfirmationPage.d.ts +3 -0
- package/dist/pages/OrderConfirmationPage.js +178 -0
- package/dist/pages/OrderConfirmationPage.js.map +1 -0
- package/dist/pages/OrdersPage.d.ts +8 -0
- package/dist/pages/OrdersPage.js +358 -0
- package/dist/pages/OrdersPage.js.map +1 -0
- package/dist/pages/ProductCategoryPage.d.ts +3 -0
- package/dist/pages/ProductCategoryPage.js +83 -0
- package/dist/pages/ProductCategoryPage.js.map +1 -0
- package/dist/pages/ProductDetailPage.d.ts +8 -0
- package/dist/pages/ProductDetailPage.js +1205 -0
- package/dist/pages/ProductDetailPage.js.map +1 -0
- package/dist/pages/ProductReviewsPage.d.ts +3 -0
- package/dist/pages/ProductReviewsPage.js +86 -0
- package/dist/pages/ProductReviewsPage.js.map +1 -0
- package/dist/pages/PublisherDashboardPage.d.ts +3 -0
- package/dist/pages/PublisherDashboardPage.js +154 -0
- package/dist/pages/PublisherDashboardPage.js.map +1 -0
- package/dist/pages/PublisherRevenuePage.d.ts +3 -0
- package/dist/pages/PublisherRevenuePage.js +138 -0
- package/dist/pages/PublisherRevenuePage.js.map +1 -0
- package/dist/pages/PublisherSubmissionsPage.d.ts +3 -0
- package/dist/pages/PublisherSubmissionsPage.js +174 -0
- package/dist/pages/PublisherSubmissionsPage.js.map +1 -0
- package/dist/pages/PublisherSubmitPage.d.ts +3 -0
- package/dist/pages/PublisherSubmitPage.js +224 -0
- package/dist/pages/PublisherSubmitPage.js.map +1 -0
- package/dist/pages/SearchResultsPage.d.ts +3 -0
- package/dist/pages/SearchResultsPage.js +125 -0
- package/dist/pages/SearchResultsPage.js.map +1 -0
- package/dist/pages/StoresPage.d.ts +3 -0
- package/dist/pages/StoresPage.js +154 -0
- package/dist/pages/StoresPage.js.map +1 -0
- package/dist/providers/StoreProvider.d.ts +38 -0
- package/dist/providers/StoreProvider.js +51 -0
- package/dist/providers/StoreProvider.js.map +1 -0
- package/dist/store/storeStore.d.ts +69 -0
- package/dist/store/storeStore.js +68 -0
- package/dist/store/storeStore.js.map +1 -0
- package/dist/translations/en.d.ts +518 -0
- package/dist/translations/en.js +514 -0
- package/dist/translations/en.js.map +1 -0
- package/dist/types/index.d.ts +575 -0
- package/dist/utils/index.d.ts +67 -0
- package/dist/utils/index.js +114 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/nativeBridge.d.ts +2 -0
- package/dist/utils/nativeBridge.js +2 -0
- package/package.json +105 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStoreGraphQL.js","names":[],"sources":["../../src/hooks/useStoreGraphQL.ts"],"sourcesContent":["import { useState, useEffect, useCallback, useRef, useMemo } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport { useStore } from '../providers/StoreProvider';\nimport { useStoreGraphQLWithContext } from './useStoreGraphQLWithContext';\nimport {\n BrowseStoreDocument,\n StoreProductDetailsDocument,\n HomeGroupedProductsDocument,\n} from '../generated/global-operations';\nimport { type BrowseStoreInput, type StoreProductDetailsInput } from '../generated/global-types';\n\n// Local type definitions until schema is fully defined\ntype ProductType = 'APP' | 'TEMPLATE' | 'THEME' | 'INTEGRATION' | 'WIDGET' | 'DATASET';\ntype CreateReviewInput = { productId: string; rating: number; title?: string; comment?: string };\ntype UpdateReviewInput = { rating?: number; title?: string; comment?: string };\n\n// Import generated document nodes for operations extracted to .graphql files\nimport {\n FeaturedProductsDocument,\n SearchSuggestionsDocument,\n TrendingSearchesDocument,\n FilterOptionsDocument,\n CategoriesDocument,\n ProductReviewsDocument,\n UserReviewForProductDocument,\n MyEntitlementsDocument,\n CheckEntitlementDocument,\n WorkspaceStoreOrdersDocument,\n MyPublishedProductsDocument,\n DeveloperEarningsDocument,\n CreateReviewDocument,\n UpdateReviewDocument,\n DeleteReviewDocument,\n MarkReviewHelpfulDocument,\n} from '../generated/global-operations';\n\n// ============================================================================\n// Helper to get Apollo Client\n// ============================================================================\n\n/**\n * Hook to get the store Apollo client from the shell's GatewayRoute context.\n * The Store route is wrapped with <GatewayRoute gateway=\"global\"> in the app shell,\n * so useApolloClient() returns the global gateway client.\n */\nfunction useStoreClient() {\n return useApolloClient();\n}\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ninterface StoreProduct {\n id: string;\n name: string;\n slug: string;\n type: string;\n nature: string;\n status: string;\n description?: string;\n pricingModel: string;\n price: number;\n currency: string;\n icon?: string;\n screenshots: string[];\n rating?: number;\n reviewCount: number;\n downloads: number;\n featured: boolean;\n category?: string;\n tags?: string[];\n publishedAt?: string;\n publisher?: {\n id: string;\n name: string;\n isVerified: boolean;\n logoUrl?: string;\n };\n}\n\ninterface BrowseStoreResult {\n products: StoreProduct[];\n totalCount: number;\n hasMore: boolean;\n nextCursor?: string;\n facets?: {\n types: { value: string; count: number }[];\n subTypes: { value: string; count: number }[];\n categories: { value: string; count: number }[];\n pricingModels: { value: string; count: number }[];\n licenses: { value: string; count: number }[];\n priceRange?: { min: number; max: number };\n ratingDistribution?: {\n fiveStars: number;\n fourStars: number;\n threeStars: number;\n twoStars: number;\n oneStar: number;\n };\n };\n}\n\ninterface ProductReview {\n id: string;\n productId: string;\n userId: string;\n rating: number;\n title?: string;\n comment?: string;\n status: string;\n helpful: number;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface ProductCategory {\n id: string;\n name: string;\n slug: string;\n description?: string;\n icon?: string;\n parentId?: string;\n}\n\ninterface SearchSuggestion {\n term: string;\n type: string;\n count: number;\n highlight?: string;\n}\n\ninterface GroupedProducts {\n featured: StoreProduct[];\n mostDownloaded: StoreProduct[];\n recentlyAdded: StoreProduct[];\n freeItems: StoreProduct[];\n}\n\n// GraphQL Query Result Types\ninterface StoreProductDetailsData {\n storeProductDetails?: {\n product: StoreProduct;\n publisher?: {\n id: string;\n name: string;\n isVerified: boolean;\n logoUrl?: string;\n };\n relatedProducts?: StoreProduct[];\n reviews?: ProductReview[];\n } | null;\n}\n\ninterface FilterOptionsData {\n filterOptions?: {\n types: { value: string; count: number }[];\n subTypes: { value: string; count: number }[];\n categories: { value: string; count: number }[];\n pricingModels: { value: string; count: number }[];\n licenses: { value: string; count: number }[];\n priceRange?: { min: number; max: number };\n } | null;\n}\n\ninterface CheckEntitlementData {\n checkEntitlement?: {\n hasAccess: boolean;\n entitlement?: {\n id: string;\n productId: string;\n type: string;\n status: string;\n expiresAt?: string;\n };\n } | null;\n}\n\ninterface DeveloperEarningsData {\n developerEarnings?: {\n totalEarnings: number;\n pendingPayout: number;\n periodEarnings: number;\n currency: string;\n transactions?: Array<{\n id: string;\n amount: number;\n type: string;\n status: string;\n createdAt: string;\n }>;\n } | null;\n}\n\n// ============================================================================\n// Browse & Search Hooks\n// ============================================================================\n\n/**\n * Hook to browse/search store products with filters\n * Uses Apollo Client from context\n */\nexport function useBrowseStore(input: BrowseStoreInput = {}) {\n const client = useStoreClient();\n const [products, setProducts] = useState<StoreProduct[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [facets, setFacets] = useState<BrowseStoreResult['facets']>(undefined);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n // Stringify input to use as stable dependency\n const inputKey = JSON.stringify(input);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ browseStore: BrowseStoreResult }>({\n query: BrowseStoreDocument,\n variables: { input: JSON.parse(inputKey) },\n fetchPolicy: 'network-only',\n });\n setProducts(result.data?.browseStore?.products ?? []);\n setTotalCount(result.data?.browseStore?.totalCount ?? 0);\n setHasMore(result.data?.browseStore?.hasMore ?? false);\n setFacets(result.data?.browseStore?.facets);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, inputKey]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n products,\n totalCount,\n hasMore,\n facets,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to browse/search store products with organization context.\n * Uses organization-aware GraphQL client with automatic headers.\n * Automatically applies defaultCompatibleWith from store context\n * to the filter if not already specified in the input.\n */\nexport function useBrowseStoreWithContext(\n input: BrowseStoreInput = {},\n options?: { skip?: boolean }\n) {\n const { query: queryWithContext, hasOrganizationContext } = useStoreGraphQLWithContext();\n const globalClient = useApolloClient();\n const { defaultCompatibleWith } = useStore();\n const [allProducts, setAllProducts] = useState<StoreProduct[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [facets, setFacets] = useState<BrowseStoreResult['facets']>(undefined);\n const [loading, setLoading] = useState(!options?.skip);\n const [error, setError] = useState<Error | null>(null);\n const [currentOffset, setCurrentOffset] = useState(input.pagination?.offset ?? 0);\n\n const skip = options?.skip;\n\n // Merge defaultCompatibleWith into the input filter if not already set\n const mergedInput = useMemo(() => {\n if (!defaultCompatibleWith) return input;\n const merged = { ...input };\n if (merged.filter) {\n merged.filter = { ...merged.filter };\n if (!merged.filter.compatibleWith) {\n merged.filter.compatibleWith = defaultCompatibleWith;\n }\n } else {\n merged.filter = { compatibleWith: defaultCompatibleWith };\n }\n return merged;\n }, [input, defaultCompatibleWith]);\n\n // Stringify only filter/sort/type parts (NOT offset) as stable dependency\n // so changing offset for loadMore doesn't retrigger the effect\n const filterKey = useMemo(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { pagination, ...rest } = mergedInput;\n return JSON.stringify(rest);\n }, [mergedInput]);\n\n const pageLimit = input.pagination?.limit ?? 30;\n\n const fetchData = useCallback(\n async (fetchOffset: number, append: boolean) => {\n if (skip) {\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const queryInput: BrowseStoreInput = {\n ...(JSON.parse(filterKey) as BrowseStoreInput),\n pagination: { ...mergedInput.pagination, limit: pageLimit, offset: fetchOffset },\n };\n\n let result;\n\n if (hasOrganizationContext) {\n // Use organization-aware query\n result = (await queryWithContext({\n query: BrowseStoreDocument,\n variables: { input: queryInput },\n fetchPolicy: 'network-only',\n })) as { data?: { browseStore: BrowseStoreResult } };\n } else {\n // Fallback to global client without organization context\n result = await globalClient.query<{ browseStore: BrowseStoreResult }>({\n query: BrowseStoreDocument,\n variables: { input: queryInput },\n fetchPolicy: 'network-only',\n });\n }\n\n const fetched = result.data?.browseStore?.products ?? [];\n if (append) {\n setAllProducts((prev) => [...prev, ...fetched]);\n } else {\n setAllProducts(fetched);\n }\n setTotalCount(result.data?.browseStore?.totalCount ?? 0);\n setHasMore(result.data?.browseStore?.hasMore ?? false);\n setFacets(result.data?.browseStore?.facets);\n setCurrentOffset(fetchOffset + fetched.length);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n },\n [\n queryWithContext,\n globalClient,\n hasOrganizationContext,\n filterKey,\n skip,\n pageLimit,\n mergedInput.pagination,\n ]\n );\n\n // Re-fetch from offset 0 whenever filters/sort change\n useEffect(() => {\n void fetchData(input.pagination?.offset ?? 0, false);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [filterKey, skip]);\n\n const loadMore = useCallback(() => {\n if (!hasMore || loading) return;\n void fetchData(currentOffset, true);\n }, [fetchData, hasMore, loading, currentOffset]);\n\n return {\n products: allProducts,\n totalCount,\n hasMore,\n facets,\n loading,\n error,\n refetch: () => fetchData(input.pagination?.offset ?? 0, false),\n loadMore,\n };\n}\n\n/**\n * Lazy hook to browse store on demand\n */\nexport function useLazyBrowseStore() {\n const client = useStoreClient();\n const [products, setProducts] = useState<StoreProduct[]>([]);\n const [totalCount, setTotalCount] = useState(0);\n const [hasMore, setHasMore] = useState(false);\n const [facets, setFacets] = useState<BrowseStoreResult['facets']>(undefined);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const browseStore = useCallback(\n async (input: BrowseStoreInput = {}) => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ browseStore: BrowseStoreResult }>({\n query: BrowseStoreDocument,\n variables: { input },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.browseStore;\n setProducts(data?.products ?? []);\n setTotalCount(data?.totalCount ?? 0);\n setHasMore(data?.hasMore ?? false);\n setFacets(data?.facets);\n return data;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n browseStore,\n products,\n totalCount,\n hasMore,\n facets,\n loading,\n error,\n };\n}\n\n/**\n * Hook to fetch product details for product page\n */\nexport function useStoreProductDetails(input: StoreProductDetailsInput) {\n const { query: queryWithContext, hasOrganizationContext } = useStoreGraphQLWithContext();\n const globalClient = useApolloClient();\n const [data, setData] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const shouldSkip = !input.id && !input.slug;\n\n // Stringify input to use as stable dependency (prevents infinite loops)\n const inputKey = JSON.stringify(input);\n\n // Track if fetch has been attempted for this input\n const fetchedRef = useRef<string | null>(null);\n\n const fetchData = useCallback(async () => {\n if (shouldSkip) {\n setLoading(false);\n return;\n }\n\n // Skip if already fetched for this input\n if (fetchedRef.current === inputKey) {\n return;\n }\n fetchedRef.current = inputKey;\n\n setLoading(true);\n setError(null);\n try {\n const result = hasOrganizationContext\n ? ((await queryWithContext({\n query: StoreProductDetailsDocument,\n variables: { input: JSON.parse(inputKey) },\n fetchPolicy: 'network-only',\n })) as { data?: StoreProductDetailsData })\n : await globalClient.query<StoreProductDetailsData>({\n query: StoreProductDetailsDocument,\n variables: { input: JSON.parse(inputKey) },\n fetchPolicy: 'network-only',\n });\n setData(result.data?.storeProductDetails ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [globalClient, hasOrganizationContext, inputKey, queryWithContext, shouldSkip]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n data,\n loading,\n error,\n refetch: () => {\n fetchedRef.current = null; // Reset to allow refetch\n return fetchData();\n },\n };\n}\n\n/**\n * Lazy hook to fetch product details on demand\n */\nexport function useLazyStoreProductDetails() {\n const { query: queryWithContext, hasOrganizationContext } = useStoreGraphQLWithContext();\n const globalClient = useApolloClient();\n const [data, setData] = useState<unknown>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const getProductDetails = useCallback(\n async (input: StoreProductDetailsInput) => {\n setLoading(true);\n setError(null);\n try {\n const result = hasOrganizationContext\n ? ((await queryWithContext({\n query: StoreProductDetailsDocument,\n variables: { input },\n })) as { data?: StoreProductDetailsData })\n : await globalClient.query<StoreProductDetailsData>({\n query: StoreProductDetailsDocument,\n variables: { input },\n });\n const details = result.data?.storeProductDetails ?? null;\n setData(details);\n return details;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [globalClient, hasOrganizationContext, queryWithContext]\n );\n\n return {\n getProductDetails,\n data,\n loading,\n error,\n };\n}\n\n/**\n * Hook to fetch grouped products for homepage.\n */\nexport function useHomeGroupedProducts(options?: { skip?: boolean }) {\n const client = useStoreClient();\n const { defaultCompatibleWith } = useStore();\n const [data, setData] = useState<GroupedProducts | null>(null);\n const [loading, setLoading] = useState(!options?.skip);\n const [error, setError] = useState<Error | null>(null);\n\n const skip = options?.skip;\n\n const fetchData = useCallback(async () => {\n if (skip) {\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ homeGroupedProducts: GroupedProducts }>({\n query: HomeGroupedProductsDocument,\n variables: { compatibleWith: defaultCompatibleWith ?? null },\n fetchPolicy: 'cache-first',\n });\n setData(result.data?.homeGroupedProducts ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, defaultCompatibleWith, skip]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n data,\n featured: data?.featured ?? [],\n mostDownloaded: data?.mostDownloaded ?? [],\n recentlyAdded: data?.recentlyAdded ?? [],\n freeItems: data?.freeItems ?? [],\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch featured products\n */\nexport function useFeaturedProducts(limit?: number) {\n const client = useStoreClient();\n const [products, setProducts] = useState<StoreProduct[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ featuredProducts: StoreProduct[] }>({\n query: FeaturedProductsDocument,\n variables: { limit },\n fetchPolicy: 'cache-first',\n });\n setProducts(result.data?.featuredProducts ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, limit]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n products,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch search suggestions for autocomplete\n */\nexport function useSearchSuggestions(\n query: string,\n options?: { limit?: number; types?: string[] }\n) {\n const client = useStoreClient();\n const [suggestions, setSuggestions] = useState<SearchSuggestion[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const shouldSkip = query.length < 2;\n\n const fetchData = useCallback(async () => {\n if (shouldSkip) {\n setSuggestions([]);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ searchSuggestions: SearchSuggestion[] }>({\n query: SearchSuggestionsDocument,\n variables: { query, limit: options?.limit, types: options?.types },\n fetchPolicy: 'network-only',\n });\n setSuggestions(result.data?.searchSuggestions ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, query, options?.limit, options?.types, shouldSkip]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n suggestions,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Lazy hook to fetch search suggestions on demand\n */\nexport function useLazySearchSuggestions() {\n const client = useStoreClient();\n const [suggestions, setSuggestions] = useState<SearchSuggestion[]>([]);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const getSuggestions = useCallback(\n async (query: string, options?: { limit?: number; types?: string[] }) => {\n if (query.length < 2) {\n setSuggestions([]);\n return [];\n }\n\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ searchSuggestions: SearchSuggestion[] }>({\n query: SearchSuggestionsDocument,\n variables: { query, limit: options?.limit, types: options?.types },\n fetchPolicy: 'network-only',\n });\n const data = result.data?.searchSuggestions ?? [];\n setSuggestions(data);\n return data;\n } catch (err) {\n setError(err as Error);\n return [];\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n getSuggestions,\n suggestions,\n loading,\n error,\n };\n}\n\n/**\n * Hook to fetch trending search terms\n */\nexport function useTrendingSearches(options?: { limit?: number; type?: ProductType }) {\n const client = useStoreClient();\n const [terms, setTerms] = useState<string[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ trendingSearches: string[] }>({\n query: TrendingSearchesDocument,\n variables: { limit: options?.limit, type: options?.type },\n fetchPolicy: 'cache-first',\n });\n setTerms(result.data?.trendingSearches ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, options?.limit, options?.type]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n terms,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch filter options for dropdowns\n */\nexport function useFilterOptions(options?: { type?: ProductType; withProducts?: boolean }) {\n const client = useStoreClient();\n const [filterOptions, setFilterOptions] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<FilterOptionsData>({\n query: FilterOptionsDocument,\n variables: { type: options?.type, withProducts: options?.withProducts },\n fetchPolicy: 'cache-first',\n });\n setFilterOptions(result.data?.filterOptions ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, options?.type, options?.withProducts]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n filterOptions,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Category Hooks\n// ============================================================================\n\n/**\n * Hook to fetch all categories\n */\nexport function useCategories() {\n const client = useStoreClient();\n const [categories, setCategories] = useState<ProductCategory[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ categories: ProductCategory[] }>({\n query: CategoriesDocument,\n fetchPolicy: 'cache-first',\n });\n setCategories(result.data?.categories ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n categories,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Review Hooks\n// ============================================================================\n\n/**\n * Hook to fetch reviews for a product\n */\nexport function useProductReviews(productId: string, options?: { status?: string }) {\n const client = useStoreClient();\n const [reviews, setReviews] = useState<ProductReview[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!productId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ productReviews: ProductReview[] }>({\n query: ProductReviewsDocument,\n variables: { productId, status: options?.status },\n fetchPolicy: 'cache-first',\n });\n setReviews(result.data?.productReviews ?? []);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, productId, options?.status]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n reviews,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to fetch current user's review for a product\n */\nexport function useUserReviewForProduct(productId: string) {\n const client = useStoreClient();\n const [review, setReview] = useState<ProductReview | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!productId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ userReviewForProduct: ProductReview | null }>({\n query: UserReviewForProductDocument,\n variables: { productId },\n fetchPolicy: 'network-only',\n });\n setReview(result.data?.userReviewForProduct ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, productId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n review,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n/**\n * Hook to create a review\n */\nexport function useCreateReview() {\n const client = useStoreClient();\n const [review, setReview] = useState<ProductReview | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const createReview = useCallback(\n async (input: CreateReviewInput) => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.mutate<{ createReview: ProductReview }>({\n mutation: CreateReviewDocument,\n variables: { input },\n });\n const data = result.data?.createReview ?? null;\n setReview(data);\n return data;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n createReview,\n review,\n loading,\n error,\n };\n}\n\n/**\n * Hook to update a review\n */\nexport function useUpdateReview() {\n const client = useStoreClient();\n const [review, setReview] = useState<ProductReview | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const updateReview = useCallback(\n async (id: string, input: UpdateReviewInput) => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.mutate<{ updateReview: ProductReview }>({\n mutation: UpdateReviewDocument,\n variables: { id, input },\n });\n const data = result.data?.updateReview ?? null;\n setReview(data);\n return data;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n updateReview,\n review,\n loading,\n error,\n };\n}\n\n/**\n * Hook to delete a review\n */\nexport function useDeleteReview() {\n const client = useStoreClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const deleteReview = useCallback(\n async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.mutate<{ deleteReview: boolean }>({\n mutation: DeleteReviewDocument,\n variables: { id },\n });\n return result.data?.deleteReview ?? false;\n } catch (err) {\n setError(err as Error);\n return false;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n deleteReview,\n loading,\n error,\n };\n}\n\n/**\n * Hook to mark review as helpful\n */\nexport function useMarkReviewHelpful() {\n const client = useStoreClient();\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const markHelpful = useCallback(\n async (id: string) => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.mutate<{ markReviewHelpful: { id: string; helpful: number } }>({\n mutation: MarkReviewHelpfulDocument,\n variables: { id },\n });\n return result.data?.markReviewHelpful ?? null;\n } catch (err) {\n setError(err as Error);\n return null;\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n return {\n markHelpful,\n loading,\n error,\n };\n}\n\n// ============================================================================\n// Entitlement Hooks\n// ============================================================================\n\n/**\n * Hook to fetch current user's entitlements\n */\nexport function useMyEntitlements() {\n const { query: queryWithContext, hasOrganizationContext } = useStoreGraphQLWithContext();\n const globalClient = useApolloClient();\n const PAGE_SIZE = 20;\n const [allEntitlements, setAllEntitlements] = useState<unknown[]>([]);\n const [hasMore, setHasMore] = useState(false);\n const [currentOffset, setCurrentOffset] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(\n async (fetchOffset = 0, append = false) => {\n setLoading(true);\n setError(null);\n try {\n const variables = { limit: PAGE_SIZE, offset: fetchOffset };\n const result = hasOrganizationContext\n ? ((await queryWithContext({\n query: MyEntitlementsDocument,\n variables,\n fetchPolicy: 'network-only',\n })) as { data?: { myEntitlements: unknown[] } })\n : await globalClient.query<{ myEntitlements: unknown[] }>({\n query: MyEntitlementsDocument,\n variables,\n fetchPolicy: 'network-only',\n });\n const fetched = result.data?.myEntitlements ?? [];\n if (append) {\n setAllEntitlements((prev) => [...prev, ...fetched]);\n } else {\n setAllEntitlements(fetched);\n }\n setHasMore(fetched.length === PAGE_SIZE);\n setCurrentOffset(fetchOffset);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n },\n [globalClient, hasOrganizationContext, queryWithContext]\n );\n\n useEffect(() => {\n fetchData(0);\n }, [fetchData]);\n\n const loadMore = useCallback(() => {\n if (!hasMore || loading) return;\n fetchData(currentOffset + PAGE_SIZE, true);\n }, [fetchData, hasMore, loading, currentOffset]);\n\n return {\n entitlements: allEntitlements,\n hasMore,\n loading,\n error,\n refetch: () => fetchData(0),\n loadMore,\n };\n}\n\n/**\n * Hook to check entitlement for a product\n */\nexport function useCheckEntitlement(productId: string) {\n const client = useStoreClient();\n const [entitlement, setEntitlement] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!productId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<CheckEntitlementData>({\n query: CheckEntitlementDocument,\n variables: { productId },\n fetchPolicy: 'network-only',\n });\n setEntitlement(result.data?.checkEntitlement ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, productId]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n entitlement,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Order Hooks\n// ============================================================================\n\n/**\n * Hook to fetch workspace store orders\n */\nexport function useWorkspaceStoreOrders(\n billingAccountId: string,\n page: number,\n limit: number,\n options?: { status?: string; search?: string }\n) {\n const client = useStoreClient();\n const [orders, setOrders] = useState<unknown[]>([]);\n const [total, setTotal] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n if (!billingAccountId) {\n setLoading(false);\n return;\n }\n\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{\n workspaceStoreOrders: { total: number; orders: unknown[] };\n }>({\n query: WorkspaceStoreOrdersDocument,\n variables: {\n billingAccountId,\n page,\n limit,\n status: options?.status,\n search: options?.search,\n },\n fetchPolicy: 'network-only',\n });\n setOrders(result.data?.workspaceStoreOrders?.orders ?? []);\n setTotal(result.data?.workspaceStoreOrders?.total ?? 0);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [client, billingAccountId, page, limit, options?.status, options?.search]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n orders,\n total,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Publisher Hooks\n// ============================================================================\n\n/**\n * Hook to fetch publisher's products\n */\nexport function useMyPublishedProducts() {\n const client = useStoreClient();\n const [allProducts, setAllProducts] = useState<StoreProduct[]>([]);\n const [hasMore, setHasMore] = useState(false);\n const [currentOffset, setCurrentOffset] = useState(0);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const PAGE_SIZE = 20;\n\n const fetchData = useCallback(\n async (fetchOffset = 0, append = false) => {\n setLoading(true);\n setError(null);\n try {\n const result = await client.query<{ publishedProducts: StoreProduct[] }>({\n query: MyPublishedProductsDocument,\n variables: { limit: PAGE_SIZE, offset: fetchOffset },\n fetchPolicy: 'network-only',\n });\n const fetched = result.data?.publishedProducts ?? [];\n if (append) {\n setAllProducts((prev) => [...prev, ...fetched]);\n } else {\n setAllProducts(fetched);\n }\n setHasMore(fetched.length === PAGE_SIZE);\n setCurrentOffset(fetchOffset + fetched.length);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n },\n [client]\n );\n\n const loadMore = useCallback(() => {\n if (!hasMore || loading) return;\n void fetchData(currentOffset, true);\n }, [fetchData, hasMore, loading, currentOffset]);\n\n useEffect(() => {\n void fetchData(0, false);\n }, [fetchData]);\n\n return {\n products: allProducts,\n hasMore,\n loading,\n error,\n refetch: () => fetchData(0, false),\n loadMore,\n };\n}\n\n/**\n * Hook to fetch developer earnings\n */\nexport function useDeveloperEarnings(options?: {\n period?: string;\n startDate?: string;\n endDate?: string;\n}) {\n const { query: queryWithContext, hasOrganizationContext } = useStoreGraphQLWithContext();\n const globalClient = useApolloClient();\n const [earnings, setEarnings] = useState<unknown>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchData = useCallback(async () => {\n setLoading(true);\n setError(null);\n try {\n const result = hasOrganizationContext\n ? ((await queryWithContext({\n query: DeveloperEarningsDocument,\n variables: { input: options },\n fetchPolicy: 'network-only',\n })) as { data?: DeveloperEarningsData })\n : await globalClient.query<DeveloperEarningsData>({\n query: DeveloperEarningsDocument,\n variables: { input: options },\n fetchPolicy: 'network-only',\n });\n setEarnings(result.data?.developerEarnings ?? null);\n } catch (err) {\n setError(err as Error);\n } finally {\n setLoading(false);\n }\n }, [globalClient, hasOrganizationContext, options, queryWithContext]);\n\n useEffect(() => {\n fetchData();\n }, [fetchData]);\n\n return {\n earnings,\n loading,\n error,\n refetch: fetchData,\n };\n}\n\n// ============================================================================\n// Re-export types for convenience\n// ============================================================================\n\nexport type {\n BrowseStoreInput,\n StoreProductDetailsInput,\n ProductType,\n CreateReviewInput,\n UpdateReviewInput,\n StoreProduct,\n ProductReview,\n ProductCategory,\n SearchSuggestion,\n GroupedProducts,\n BrowseStoreResult,\n};\n"],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { DocumentNode, OperationVariables, TypedDocumentNode } from '@apollo/client/core';
|
|
2
|
+
|
|
3
|
+
type GraphQLDocument = DocumentNode | TypedDocumentNode<unknown, OperationVariables>;
|
|
4
|
+
interface QueryWithContextOptions<TVariables extends OperationVariables = OperationVariables> {
|
|
5
|
+
query: GraphQLDocument;
|
|
6
|
+
variables?: TVariables;
|
|
7
|
+
fetchPolicy?: 'cache-first' | 'network-only' | 'cache-only' | 'no-cache';
|
|
8
|
+
context?: {
|
|
9
|
+
headers?: Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
interface MutationWithContextOptions<TVariables extends OperationVariables = OperationVariables> {
|
|
13
|
+
mutation: GraphQLDocument;
|
|
14
|
+
variables?: TVariables;
|
|
15
|
+
context?: {
|
|
16
|
+
headers?: Record<string, string>;
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Enhanced GraphQL client hook that automatically includes organization context
|
|
21
|
+
* in all requests to ensure proper organization-scoped licensing.
|
|
22
|
+
*/
|
|
23
|
+
export declare function useStoreGraphQLWithContext(): {
|
|
24
|
+
query: <TVariables extends OperationVariables = OperationVariables>(options: QueryWithContextOptions<TVariables>) => Promise<import("@apollo/client").ApolloClient.QueryResult<unknown>>;
|
|
25
|
+
mutate: <TVariables extends OperationVariables = OperationVariables>(options: MutationWithContextOptions<TVariables>) => Promise<import("@apollo/client").ApolloClient.MutateResult<unknown>>;
|
|
26
|
+
organizationId: string | undefined;
|
|
27
|
+
hasOrganizationContext: boolean;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Hook to get organization-aware Apollo Client with automatic context headers
|
|
31
|
+
* This ensures all GraphQL operations include proper organization context.
|
|
32
|
+
*/
|
|
33
|
+
export declare function useOrganizationAwareClient(): {
|
|
34
|
+
client: {
|
|
35
|
+
query: (options: QueryWithContextOptions) => Promise<import("@apollo/client").ApolloClient.QueryResult<unknown>>;
|
|
36
|
+
mutate: (options: MutationWithContextOptions) => Promise<import("@apollo/client").ApolloClient.MutateResult<unknown>>;
|
|
37
|
+
watchQuery: <TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: import("@apollo/client").ApolloClient.WatchQueryOptions<TData, TVariables>) => import('@apollo/client').ObservableQuery<TData, TVariables>;
|
|
38
|
+
readQuery: {
|
|
39
|
+
<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: import("@apollo/client").ApolloClient.ReadQueryOptions<TData, TVariables>): TData | null;
|
|
40
|
+
<TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: import("@apollo/client").ApolloClient.ReadQueryOptions<TData, TVariables>, optimistic: boolean): TData | null;
|
|
41
|
+
};
|
|
42
|
+
writeQuery: <TData = unknown, TVariables extends OperationVariables = OperationVariables>(options: import("@apollo/client").ApolloClient.WriteQueryOptions<TData, TVariables>) => import('@apollo/client').Reference | undefined;
|
|
43
|
+
cache: import('@apollo/client').ApolloCache;
|
|
44
|
+
};
|
|
45
|
+
organizationId: string | undefined;
|
|
46
|
+
hasOrganizationContext: boolean;
|
|
47
|
+
};
|
|
48
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
|
+
import { useCallback as t } from "react";
|
|
3
|
+
import { useApolloClient as n } from "@apollo/client/react";
|
|
4
|
+
//#region src/hooks/useStoreGraphQLWithContext.ts
|
|
5
|
+
function r() {
|
|
6
|
+
let r = n(), { organizationId: i, user: a, authToken: o } = e(), s = t(() => {
|
|
7
|
+
let e = {};
|
|
8
|
+
return i && (e["x-org-id"] = i), a?.id && (e["x-actor-id"] = a.id, e["x-actor-type"] = "user"), a?.workspaceId && (e["x-workspace-id"] = a.workspaceId), o && (e.Authorization = `Bearer ${o}`), e;
|
|
9
|
+
}, [
|
|
10
|
+
i,
|
|
11
|
+
a,
|
|
12
|
+
o
|
|
13
|
+
]);
|
|
14
|
+
return {
|
|
15
|
+
query: t(async (e) => {
|
|
16
|
+
let t = s();
|
|
17
|
+
return r.query({
|
|
18
|
+
query: e.query,
|
|
19
|
+
variables: e.variables,
|
|
20
|
+
fetchPolicy: e.fetchPolicy,
|
|
21
|
+
context: { headers: t }
|
|
22
|
+
});
|
|
23
|
+
}, [r, s]),
|
|
24
|
+
mutate: t(async (e) => {
|
|
25
|
+
let t = s();
|
|
26
|
+
return r.mutate({
|
|
27
|
+
mutation: e.mutation,
|
|
28
|
+
variables: e.variables,
|
|
29
|
+
context: { headers: t }
|
|
30
|
+
});
|
|
31
|
+
}, [r, s]),
|
|
32
|
+
organizationId: i,
|
|
33
|
+
hasOrganizationContext: !!i
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//#endregion
|
|
37
|
+
export { r as useStoreGraphQLWithContext };
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=useStoreGraphQLWithContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStoreGraphQLWithContext.js","names":[],"sources":["../../src/hooks/useStoreGraphQLWithContext.ts"],"sourcesContent":["import { useCallback } from 'react';\nimport { useApolloClient } from '@apollo/client/react';\nimport type { DocumentNode, OperationVariables, TypedDocumentNode } from '@apollo/client/core';\nimport { useStore } from '../providers/StoreProvider';\n\ntype GraphQLDocument = DocumentNode | TypedDocumentNode<unknown, OperationVariables>;\n\ninterface QueryWithContextOptions<TVariables extends OperationVariables = OperationVariables> {\n query: GraphQLDocument;\n variables?: TVariables;\n fetchPolicy?: 'cache-first' | 'network-only' | 'cache-only' | 'no-cache';\n context?: { headers?: Record<string, string> };\n}\n\ninterface MutationWithContextOptions<TVariables extends OperationVariables = OperationVariables> {\n mutation: GraphQLDocument;\n variables?: TVariables;\n context?: { headers?: Record<string, string> };\n}\n\n/**\n * Enhanced GraphQL client hook that automatically includes organization context\n * in all requests to ensure proper organization-scoped licensing.\n */\nexport function useStoreGraphQLWithContext() {\n const client = useApolloClient();\n const { organizationId, user, authToken } = useStore();\n\n /**\n * Get context headers for organization-scoped requests\n */\n const getContextHeaders = useCallback(() => {\n const contextHeaders: Record<string, string> = {};\n\n // Add organization ID header for organization-scoped licensing\n if (organizationId) {\n contextHeaders['x-org-id'] = organizationId;\n }\n\n // Add user context if available\n if (user?.id) {\n contextHeaders['x-actor-id'] = user.id;\n contextHeaders['x-actor-type'] = 'user';\n }\n\n // Add workspace context if available\n if (user?.workspaceId) {\n contextHeaders['x-workspace-id'] = user.workspaceId;\n }\n\n // Add auth token if available\n if (authToken) {\n contextHeaders['Authorization'] = `Bearer ${authToken}`;\n }\n\n return contextHeaders;\n }, [organizationId, user, authToken]);\n\n /**\n * Execute a GraphQL query with organization context headers\n */\n const queryWithContext = useCallback(\n async <TVariables extends OperationVariables = OperationVariables>(\n options: QueryWithContextOptions<TVariables>\n ) => {\n const contextHeaders = getContextHeaders();\n\n return client.query({\n query: options.query,\n variables: options.variables,\n fetchPolicy: options.fetchPolicy,\n context: {\n headers: contextHeaders,\n },\n });\n },\n [client, getContextHeaders]\n );\n\n /**\n * Execute a GraphQL mutation with organization context headers\n */\n const mutateWithContext = useCallback(\n async <TVariables extends OperationVariables = OperationVariables>(\n options: MutationWithContextOptions<TVariables>\n ) => {\n const contextHeaders = getContextHeaders();\n\n return client.mutate({\n mutation: options.mutation,\n variables: options.variables,\n context: {\n headers: contextHeaders,\n },\n });\n },\n [client, getContextHeaders]\n );\n\n return {\n query: queryWithContext,\n mutate: mutateWithContext,\n organizationId,\n hasOrganizationContext: Boolean(organizationId),\n };\n}\n\n/**\n * Hook to get organization-aware Apollo Client with automatic context headers\n * This ensures all GraphQL operations include proper organization context.\n */\nexport function useOrganizationAwareClient() {\n const client = useApolloClient();\n const { organizationId, user, authToken } = useStore();\n\n /**\n * Create a wrapped client that automatically includes organization context\n */\n const wrappedClient = {\n query: (options: QueryWithContextOptions) => {\n const contextHeaders: Record<string, string> = {};\n\n if (organizationId) {\n contextHeaders['x-org-id'] = organizationId;\n }\n\n if (user?.id) {\n contextHeaders['x-actor-id'] = user.id;\n contextHeaders['x-actor-type'] = 'user';\n }\n\n if (user?.workspaceId) {\n contextHeaders['x-workspace-id'] = user.workspaceId;\n }\n\n if (authToken) {\n contextHeaders['Authorization'] = `Bearer ${authToken}`;\n }\n\n return client.query({\n ...options,\n context: {\n ...options.context,\n headers: {\n ...options.context?.headers,\n ...contextHeaders,\n },\n },\n });\n },\n\n mutate: (options: MutationWithContextOptions) => {\n const contextHeaders: Record<string, string> = {};\n\n if (organizationId) {\n contextHeaders['x-org-id'] = organizationId;\n }\n\n if (user?.id) {\n contextHeaders['x-actor-id'] = user.id;\n contextHeaders['x-actor-type'] = 'user';\n }\n\n if (user?.workspaceId) {\n contextHeaders['x-workspace-id'] = user.workspaceId;\n }\n\n if (authToken) {\n contextHeaders['Authorization'] = `Bearer ${authToken}`;\n }\n\n return client.mutate({\n ...options,\n context: {\n ...options.context,\n headers: {\n ...options.context?.headers,\n ...contextHeaders,\n },\n },\n });\n },\n\n // Pass through other Apollo Client methods\n watchQuery: client.watchQuery.bind(client),\n readQuery: client.readQuery.bind(client),\n writeQuery: client.writeQuery.bind(client),\n cache: client.cache,\n };\n\n return {\n client: wrappedClient,\n organizationId,\n hasOrganizationContext: Boolean(organizationId),\n };\n}\n"],"mappings":";;;;AAwBA,SAAgB,IAA6B;CAC3C,IAAM,IAAS,GAAiB,EAC1B,EAAE,mBAAgB,SAAM,iBAAc,GAAU,EAKhD,IAAoB,QAAkB;EAC1C,IAAM,IAAyC,EAAE;AAuBjD,SApBI,MACF,EAAe,cAAc,IAI3B,GAAM,OACR,EAAe,gBAAgB,EAAK,IACpC,EAAe,kBAAkB,SAI/B,GAAM,gBACR,EAAe,oBAAoB,EAAK,cAItC,MACF,EAAe,gBAAmB,UAAU,MAGvC;IACN;EAAC;EAAgB;EAAM;EAAU,CAAC;AA2CrC,QAAO;EACL,OAvCuB,EACvB,OACE,MACG;GACH,IAAM,IAAiB,GAAmB;AAE1C,UAAO,EAAO,MAAM;IAClB,OAAO,EAAQ;IACf,WAAW,EAAQ;IACnB,aAAa,EAAQ;IACrB,SAAS,EACP,SAAS,GACV;IACF,CAAC;KAEJ,CAAC,GAAQ,EAAkB,CAC5B;EAwBC,QAnBwB,EACxB,OACE,MACG;GACH,IAAM,IAAiB,GAAmB;AAE1C,UAAO,EAAO,OAAO;IACnB,UAAU,EAAQ;IAClB,WAAW,EAAQ;IACnB,SAAS,EACP,SAAS,GACV;IACF,CAAC;KAEJ,CAAC,GAAQ,EAAkB,CAC5B;EAKC;EACA,wBAAwB,EAAQ;EACjC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store permission constants matching RBAC resource:action format
|
|
3
|
+
*/
|
|
4
|
+
export declare const STORE_PERMISSIONS: {
|
|
5
|
+
readonly PRODUCT_READ: "store-product:read";
|
|
6
|
+
readonly PRODUCT_CREATE: "store-product:create";
|
|
7
|
+
readonly PRODUCT_UPDATE: "store-product:update";
|
|
8
|
+
readonly PRODUCT_DELETE: "store-product:delete";
|
|
9
|
+
readonly PRODUCT_PUBLISH: "store-product:publish";
|
|
10
|
+
readonly PRODUCT_ADMIN: "store-product:admin";
|
|
11
|
+
readonly CATEGORY_CREATE: "store-category:create";
|
|
12
|
+
readonly CATEGORY_UPDATE: "store-category:update";
|
|
13
|
+
readonly CATEGORY_DELETE: "store-category:delete";
|
|
14
|
+
readonly TAG_CREATE: "store-tag:create";
|
|
15
|
+
readonly TAG_DELETE: "store-tag:delete";
|
|
16
|
+
readonly REVIEW_CREATE: "store-review:create";
|
|
17
|
+
readonly REVIEW_UPDATE: "store-review:update";
|
|
18
|
+
readonly REVIEW_DELETE: "store-review:delete";
|
|
19
|
+
readonly REVIEW_ADMIN: "store-review:admin";
|
|
20
|
+
readonly ENTITLEMENT_READ: "store-entitlement:read";
|
|
21
|
+
readonly ENTITLEMENT_CREATE: "store-entitlement:create";
|
|
22
|
+
readonly ENTITLEMENT_UPDATE: "store-entitlement:update";
|
|
23
|
+
readonly ENTITLEMENT_DELETE: "store-entitlement:delete";
|
|
24
|
+
readonly ORDER_READ: "store-order:read";
|
|
25
|
+
readonly ORDER_CREATE: "store-order:create";
|
|
26
|
+
readonly ORDER_UPDATE: "store-order:update";
|
|
27
|
+
readonly ORDER_ADMIN: "store-order:admin";
|
|
28
|
+
readonly ORDER_EXPORT: "store-order:export";
|
|
29
|
+
readonly CART_READ: "store-cart:read";
|
|
30
|
+
readonly CART_CREATE: "store-cart:create";
|
|
31
|
+
readonly CART_UPDATE: "store-cart:update";
|
|
32
|
+
readonly CART_CHECKOUT: "store-cart:checkout";
|
|
33
|
+
readonly DOWNLOAD_READ: "store-download:read";
|
|
34
|
+
readonly DOWNLOAD_CREATE: "store-download:create";
|
|
35
|
+
readonly INSTALLATION_READ: "store-installation:read";
|
|
36
|
+
readonly INSTALLATION_CREATE: "store-installation:create";
|
|
37
|
+
readonly INSTALLATION_UPDATE: "store-installation:update";
|
|
38
|
+
readonly INSTALLATION_DELETE: "store-installation:delete";
|
|
39
|
+
readonly EARNINGS_READ: "store-earnings:read";
|
|
40
|
+
};
|
|
41
|
+
export type StorePermission = (typeof STORE_PERMISSIONS)[keyof typeof STORE_PERMISSIONS];
|
|
42
|
+
export interface StorePermissions {
|
|
43
|
+
canBrowse: boolean;
|
|
44
|
+
canPurchase: boolean;
|
|
45
|
+
canInstall: boolean;
|
|
46
|
+
canManageLicenses: boolean;
|
|
47
|
+
canPublish: boolean;
|
|
48
|
+
canModerate: boolean;
|
|
49
|
+
isPublisher: boolean;
|
|
50
|
+
isPlatformAdmin: boolean;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Hook for store permissions
|
|
54
|
+
*
|
|
55
|
+
* Integrates with the platform PermissionProvider from @burdenoff/fe-libs.
|
|
56
|
+
* Falls back to role-based checks when permissions are still loading.
|
|
57
|
+
*/
|
|
58
|
+
export declare function useStorePermissions(): {
|
|
59
|
+
permissions: StorePermissions;
|
|
60
|
+
PERMISSIONS: typeof STORE_PERMISSIONS;
|
|
61
|
+
hasPermission: (permission: StorePermission) => boolean;
|
|
62
|
+
isLoading: boolean;
|
|
63
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { useStore as e } from "../providers/StoreProvider.js";
|
|
2
|
+
import { useMemo as t } from "react";
|
|
3
|
+
import { usePermissions as n } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
4
|
+
//#region src/hooks/useStorePermissions.ts
|
|
5
|
+
var r = {
|
|
6
|
+
PRODUCT_READ: "store-product:read",
|
|
7
|
+
PRODUCT_CREATE: "store-product:create",
|
|
8
|
+
PRODUCT_UPDATE: "store-product:update",
|
|
9
|
+
PRODUCT_DELETE: "store-product:delete",
|
|
10
|
+
PRODUCT_PUBLISH: "store-product:publish",
|
|
11
|
+
PRODUCT_ADMIN: "store-product:admin",
|
|
12
|
+
CATEGORY_CREATE: "store-category:create",
|
|
13
|
+
CATEGORY_UPDATE: "store-category:update",
|
|
14
|
+
CATEGORY_DELETE: "store-category:delete",
|
|
15
|
+
TAG_CREATE: "store-tag:create",
|
|
16
|
+
TAG_DELETE: "store-tag:delete",
|
|
17
|
+
REVIEW_CREATE: "store-review:create",
|
|
18
|
+
REVIEW_UPDATE: "store-review:update",
|
|
19
|
+
REVIEW_DELETE: "store-review:delete",
|
|
20
|
+
REVIEW_ADMIN: "store-review:admin",
|
|
21
|
+
ENTITLEMENT_READ: "store-entitlement:read",
|
|
22
|
+
ENTITLEMENT_CREATE: "store-entitlement:create",
|
|
23
|
+
ENTITLEMENT_UPDATE: "store-entitlement:update",
|
|
24
|
+
ENTITLEMENT_DELETE: "store-entitlement:delete",
|
|
25
|
+
ORDER_READ: "store-order:read",
|
|
26
|
+
ORDER_CREATE: "store-order:create",
|
|
27
|
+
ORDER_UPDATE: "store-order:update",
|
|
28
|
+
ORDER_ADMIN: "store-order:admin",
|
|
29
|
+
ORDER_EXPORT: "store-order:export",
|
|
30
|
+
CART_READ: "store-cart:read",
|
|
31
|
+
CART_CREATE: "store-cart:create",
|
|
32
|
+
CART_UPDATE: "store-cart:update",
|
|
33
|
+
CART_CHECKOUT: "store-cart:checkout",
|
|
34
|
+
DOWNLOAD_READ: "store-download:read",
|
|
35
|
+
DOWNLOAD_CREATE: "store-download:create",
|
|
36
|
+
INSTALLATION_READ: "store-installation:read",
|
|
37
|
+
INSTALLATION_CREATE: "store-installation:create",
|
|
38
|
+
INSTALLATION_UPDATE: "store-installation:update",
|
|
39
|
+
INSTALLATION_DELETE: "store-installation:delete",
|
|
40
|
+
EARNINGS_READ: "store-earnings:read"
|
|
41
|
+
};
|
|
42
|
+
function i() {
|
|
43
|
+
let { user: i } = e(), a = n(), o = t(() => {
|
|
44
|
+
if (!a.isLoading && a.permissions) {
|
|
45
|
+
let e = a.hasPermission(r.PRODUCT_ADMIN) || a.hasRole("Owner") || a.hasRole("Admin"), t = a.hasPermission(r.PRODUCT_CREATE) || e;
|
|
46
|
+
return {
|
|
47
|
+
canBrowse: !0,
|
|
48
|
+
canPurchase: a.hasPermission(r.ORDER_CREATE),
|
|
49
|
+
canInstall: a.hasPermission(r.INSTALLATION_CREATE),
|
|
50
|
+
canManageLicenses: a.hasPermission(r.ENTITLEMENT_READ),
|
|
51
|
+
canPublish: t,
|
|
52
|
+
canModerate: a.hasPermission(r.REVIEW_ADMIN),
|
|
53
|
+
isPublisher: t,
|
|
54
|
+
isPlatformAdmin: e
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
let e = new Set((i?.roles ?? []).map((e) => e.toLowerCase()).filter((e) => e.length > 0));
|
|
58
|
+
i?.role && e.add(i.role.toLowerCase());
|
|
59
|
+
let t = e.has("admin") || e.has("platform_admin") || e.has("super_admin"), n = e.has("publisher") || t, o = e.size > 0;
|
|
60
|
+
return {
|
|
61
|
+
canBrowse: !0,
|
|
62
|
+
canPurchase: o,
|
|
63
|
+
canInstall: o,
|
|
64
|
+
canManageLicenses: o,
|
|
65
|
+
canPublish: n,
|
|
66
|
+
canModerate: t,
|
|
67
|
+
isPublisher: n,
|
|
68
|
+
isPlatformAdmin: t
|
|
69
|
+
};
|
|
70
|
+
}, [
|
|
71
|
+
a,
|
|
72
|
+
i?.role,
|
|
73
|
+
i?.roles
|
|
74
|
+
]);
|
|
75
|
+
return {
|
|
76
|
+
permissions: o,
|
|
77
|
+
PERMISSIONS: r,
|
|
78
|
+
hasPermission: t(() => {
|
|
79
|
+
let e = (e) => e === r.PRODUCT_ADMIN || e === r.REVIEW_ADMIN || e === r.ORDER_ADMIN || e === r.ORDER_EXPORT || e === r.CATEGORY_CREATE || e === r.CATEGORY_UPDATE || e === r.CATEGORY_DELETE || e === r.TAG_CREATE || e === r.TAG_DELETE;
|
|
80
|
+
return (t) => !a.isLoading && a.permissions ? !!(a.hasPermission(t) || e(t) && o.isPlatformAdmin) : t === r.PRODUCT_READ ? o.canBrowse : t === r.CART_READ || t === r.CART_CREATE || t === r.CART_UPDATE || t === r.CART_CHECKOUT || t === r.ORDER_CREATE || t === r.ORDER_READ ? o.canPurchase : t === r.INSTALLATION_READ || t === r.INSTALLATION_CREATE || t === r.INSTALLATION_UPDATE || t === r.INSTALLATION_DELETE ? o.canInstall : t === r.DOWNLOAD_READ || t === r.DOWNLOAD_CREATE || t === r.ORDER_UPDATE ? o.canPurchase : t === r.ENTITLEMENT_READ || t === r.ENTITLEMENT_CREATE || t === r.ENTITLEMENT_UPDATE || t === r.ENTITLEMENT_DELETE ? o.canManageLicenses : t === r.PRODUCT_CREATE || t === r.PRODUCT_UPDATE || t === r.PRODUCT_DELETE || t === r.PRODUCT_PUBLISH || t === r.EARNINGS_READ ? o.canPublish : t === r.PRODUCT_ADMIN || t === r.REVIEW_ADMIN || t === r.ORDER_ADMIN || t === r.ORDER_EXPORT || t === r.CATEGORY_CREATE || t === r.CATEGORY_UPDATE || t === r.CATEGORY_DELETE || t === r.TAG_CREATE || t === r.TAG_DELETE ? o.isPlatformAdmin : t === r.REVIEW_CREATE || t === r.REVIEW_UPDATE || t === r.REVIEW_DELETE ? o.canPurchase : !1;
|
|
81
|
+
}, [a, o]),
|
|
82
|
+
isLoading: a.isLoading
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//#endregion
|
|
86
|
+
export { r as STORE_PERMISSIONS, i as useStorePermissions };
|
|
87
|
+
|
|
88
|
+
//# sourceMappingURL=useStorePermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useStorePermissions.js","names":[],"sources":["../../src/hooks/useStorePermissions.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useStore } from '../providers/StoreProvider';\n\n/**\n * Store permission constants matching RBAC resource:action format\n */\nexport const STORE_PERMISSIONS = {\n // Products\n PRODUCT_READ: 'store-product:read',\n PRODUCT_CREATE: 'store-product:create',\n PRODUCT_UPDATE: 'store-product:update',\n PRODUCT_DELETE: 'store-product:delete',\n PRODUCT_PUBLISH: 'store-product:publish',\n PRODUCT_ADMIN: 'store-product:admin',\n\n // Categories\n CATEGORY_CREATE: 'store-category:create',\n CATEGORY_UPDATE: 'store-category:update',\n CATEGORY_DELETE: 'store-category:delete',\n\n // Tags\n TAG_CREATE: 'store-tag:create',\n TAG_DELETE: 'store-tag:delete',\n\n // Reviews\n REVIEW_CREATE: 'store-review:create',\n REVIEW_UPDATE: 'store-review:update',\n REVIEW_DELETE: 'store-review:delete',\n REVIEW_ADMIN: 'store-review:admin',\n\n // Entitlements\n ENTITLEMENT_READ: 'store-entitlement:read',\n ENTITLEMENT_CREATE: 'store-entitlement:create',\n ENTITLEMENT_UPDATE: 'store-entitlement:update',\n ENTITLEMENT_DELETE: 'store-entitlement:delete',\n\n // Orders\n ORDER_READ: 'store-order:read',\n ORDER_CREATE: 'store-order:create',\n ORDER_UPDATE: 'store-order:update',\n ORDER_ADMIN: 'store-order:admin',\n ORDER_EXPORT: 'store-order:export',\n\n // Cart\n CART_READ: 'store-cart:read',\n CART_CREATE: 'store-cart:create',\n CART_UPDATE: 'store-cart:update',\n CART_CHECKOUT: 'store-cart:checkout',\n\n // Downloads\n DOWNLOAD_READ: 'store-download:read',\n DOWNLOAD_CREATE: 'store-download:create',\n\n // Installations\n INSTALLATION_READ: 'store-installation:read',\n INSTALLATION_CREATE: 'store-installation:create',\n INSTALLATION_UPDATE: 'store-installation:update',\n INSTALLATION_DELETE: 'store-installation:delete',\n\n // Earnings\n EARNINGS_READ: 'store-earnings:read',\n} as const;\n\nexport type StorePermission = (typeof STORE_PERMISSIONS)[keyof typeof STORE_PERMISSIONS];\n\nexport interface StorePermissions {\n canBrowse: boolean;\n canPurchase: boolean;\n canInstall: boolean;\n canManageLicenses: boolean;\n canPublish: boolean;\n canModerate: boolean;\n isPublisher: boolean;\n isPlatformAdmin: boolean;\n}\n\n/**\n * Hook for store permissions\n *\n * Integrates with the platform PermissionProvider from @burdenoff/fe-libs.\n * Falls back to role-based checks when permissions are still loading.\n */\nexport function useStorePermissions(): {\n permissions: StorePermissions;\n PERMISSIONS: typeof STORE_PERMISSIONS;\n hasPermission: (permission: StorePermission) => boolean;\n isLoading: boolean;\n} {\n const { user } = useStore();\n const platform = usePermissions();\n\n const permissions = useMemo<StorePermissions>(() => {\n // If platform permissions are loaded, use them\n if (!platform.isLoading && platform.permissions) {\n const isAdmin =\n platform.hasPermission(STORE_PERMISSIONS.PRODUCT_ADMIN) ||\n platform.hasRole('Owner') ||\n platform.hasRole('Admin');\n const isPublisher = platform.hasPermission(STORE_PERMISSIONS.PRODUCT_CREATE) || isAdmin;\n\n return {\n canBrowse: true,\n canPurchase: platform.hasPermission(STORE_PERMISSIONS.ORDER_CREATE),\n canInstall: platform.hasPermission(STORE_PERMISSIONS.INSTALLATION_CREATE),\n canManageLicenses: platform.hasPermission(STORE_PERMISSIONS.ENTITLEMENT_READ),\n canPublish: isPublisher,\n canModerate: platform.hasPermission(STORE_PERMISSIONS.REVIEW_ADMIN),\n isPublisher,\n isPlatformAdmin: isAdmin,\n };\n }\n\n // Fallback: role-based checks from user context while permissions load\n const normalizedRoles = new Set(\n (user?.roles ?? []).map((role) => role.toLowerCase()).filter((role) => role.length > 0)\n );\n\n if (user?.role) {\n normalizedRoles.add(user.role.toLowerCase());\n }\n\n const isAdmin =\n normalizedRoles.has('admin') ||\n normalizedRoles.has('platform_admin') ||\n normalizedRoles.has('super_admin');\n const isPublisher = normalizedRoles.has('publisher') || isAdmin;\n const hasAnyRole = normalizedRoles.size > 0;\n\n return {\n canBrowse: true,\n canPurchase: hasAnyRole,\n canInstall: hasAnyRole,\n canManageLicenses: hasAnyRole,\n canPublish: isPublisher,\n canModerate: isAdmin,\n isPublisher,\n isPlatformAdmin: isAdmin,\n };\n }, [platform, user?.role, user?.roles]);\n\n const hasPermission = useMemo(() => {\n const isAdminGatedPermission = (p: StorePermission): boolean =>\n p === STORE_PERMISSIONS.PRODUCT_ADMIN ||\n p === STORE_PERMISSIONS.REVIEW_ADMIN ||\n p === STORE_PERMISSIONS.ORDER_ADMIN ||\n p === STORE_PERMISSIONS.ORDER_EXPORT ||\n p === STORE_PERMISSIONS.CATEGORY_CREATE ||\n p === STORE_PERMISSIONS.CATEGORY_UPDATE ||\n p === STORE_PERMISSIONS.CATEGORY_DELETE ||\n p === STORE_PERMISSIONS.TAG_CREATE ||\n p === STORE_PERMISSIONS.TAG_DELETE;\n\n return (permission: StorePermission): boolean => {\n // Use platform permission check if loaded\n if (!platform.isLoading && platform.permissions) {\n // Direct permission check from RBAC\n if (platform.hasPermission(permission)) {\n return true;\n }\n // Admin-role fallback for admin-gated permissions:\n // users with Owner/Admin role (or PRODUCT_ADMIN) are treated as platform\n // admins and should be granted all admin-gated checks, even if they don't\n // have explicit RBAC grants for each admin permission. This keeps\n // isPlatformAdmin consistent with admin route guards.\n if (isAdminGatedPermission(permission) && permissions.isPlatformAdmin) {\n return true;\n }\n return false;\n }\n\n // Fallback: map permission to aggregate check\n if (permission === STORE_PERMISSIONS.PRODUCT_READ) return permissions.canBrowse;\n\n if (\n permission === STORE_PERMISSIONS.CART_READ ||\n permission === STORE_PERMISSIONS.CART_CREATE ||\n permission === STORE_PERMISSIONS.CART_UPDATE ||\n permission === STORE_PERMISSIONS.CART_CHECKOUT ||\n permission === STORE_PERMISSIONS.ORDER_CREATE ||\n permission === STORE_PERMISSIONS.ORDER_READ\n ) {\n return permissions.canPurchase;\n }\n\n if (\n permission === STORE_PERMISSIONS.INSTALLATION_READ ||\n permission === STORE_PERMISSIONS.INSTALLATION_CREATE ||\n permission === STORE_PERMISSIONS.INSTALLATION_UPDATE ||\n permission === STORE_PERMISSIONS.INSTALLATION_DELETE\n ) {\n return permissions.canInstall;\n }\n\n if (\n permission === STORE_PERMISSIONS.DOWNLOAD_READ ||\n permission === STORE_PERMISSIONS.DOWNLOAD_CREATE\n ) {\n return permissions.canPurchase;\n }\n\n if (permission === STORE_PERMISSIONS.ORDER_UPDATE) {\n return permissions.canPurchase;\n }\n\n if (\n permission === STORE_PERMISSIONS.ENTITLEMENT_READ ||\n permission === STORE_PERMISSIONS.ENTITLEMENT_CREATE ||\n permission === STORE_PERMISSIONS.ENTITLEMENT_UPDATE ||\n permission === STORE_PERMISSIONS.ENTITLEMENT_DELETE\n ) {\n return permissions.canManageLicenses;\n }\n\n if (\n permission === STORE_PERMISSIONS.PRODUCT_CREATE ||\n permission === STORE_PERMISSIONS.PRODUCT_UPDATE ||\n permission === STORE_PERMISSIONS.PRODUCT_DELETE ||\n permission === STORE_PERMISSIONS.PRODUCT_PUBLISH ||\n permission === STORE_PERMISSIONS.EARNINGS_READ\n ) {\n return permissions.canPublish;\n }\n\n if (\n permission === STORE_PERMISSIONS.PRODUCT_ADMIN ||\n permission === STORE_PERMISSIONS.REVIEW_ADMIN ||\n permission === STORE_PERMISSIONS.ORDER_ADMIN ||\n permission === STORE_PERMISSIONS.ORDER_EXPORT ||\n permission === STORE_PERMISSIONS.CATEGORY_CREATE ||\n permission === STORE_PERMISSIONS.CATEGORY_UPDATE ||\n permission === STORE_PERMISSIONS.CATEGORY_DELETE ||\n permission === STORE_PERMISSIONS.TAG_CREATE ||\n permission === STORE_PERMISSIONS.TAG_DELETE\n ) {\n return permissions.isPlatformAdmin;\n }\n\n if (\n permission === STORE_PERMISSIONS.REVIEW_CREATE ||\n permission === STORE_PERMISSIONS.REVIEW_UPDATE ||\n permission === STORE_PERMISSIONS.REVIEW_DELETE\n ) {\n return permissions.canPurchase;\n }\n\n return false;\n };\n }, [platform, permissions]);\n\n return {\n permissions,\n PERMISSIONS: STORE_PERMISSIONS,\n hasPermission,\n isLoading: platform.isLoading,\n };\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store (App Marketplace) Microfrontend
|
|
3
|
+
*
|
|
4
|
+
* Provides a comprehensive UI for discovering, purchasing, installing, and managing
|
|
5
|
+
* both digital and physical products within the Burdenoff ecosystem.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```tsx
|
|
9
|
+
* import { StoreRoot, type StoreRootProps } from '@burdenoff/microfe-store';
|
|
10
|
+
*
|
|
11
|
+
* function App() {
|
|
12
|
+
* const props: StoreRootProps = {
|
|
13
|
+
* basePath: '/store',
|
|
14
|
+
* navigate: (path) => router.push(path),
|
|
15
|
+
* currentUser: { id: '1', email: 'user@example.com' },
|
|
16
|
+
* workspaceId: 'ws-123',
|
|
17
|
+
* organizationId: 'org-123',
|
|
18
|
+
* apiGatewayUrl: 'https://api.example.com/tenant/graphql',
|
|
19
|
+
* authToken: 'token',
|
|
20
|
+
* features: {
|
|
21
|
+
* enablePhysicalProducts: true,
|
|
22
|
+
* enablePublisherPortal: true,
|
|
23
|
+
* enableReviews: true,
|
|
24
|
+
* enableSubscriptions: true,
|
|
25
|
+
* },
|
|
26
|
+
* };
|
|
27
|
+
*
|
|
28
|
+
* return <StoreRoot {...props} />;
|
|
29
|
+
* }
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export { StoreRoot } from './StoreRoot';
|
|
33
|
+
export { StoreAdminRoot } from './StoreAdminRoot';
|
|
34
|
+
export type { StoreRootProps, StoreAdminRootProps, ProductSummary, InstallationSummary, SubmissionSummary, ItemType, ProductType, PricingModel, ProductStatus, SubscriptionStatus, InstallationStatus, LicenseType, LicenseStatus, OrderStatus, ShipmentStatus, ReviewStatus, SubmissionStatus, PaymentGateway, ViewMode, SortBy, Category, Publisher, ProductVariant, Product, CartItem, Cart, Address, ShippingMethod, Checkout, Order, Installation, License, LicenseActivation, Review, Submission, RevenueMetrics, ProductFilter, ProductSort, PageInfo, ProductConnection, GraphQLError, MutationResult, } from './types';
|
|
35
|
+
export { useStore } from './providers/StoreProvider';
|
|
36
|
+
export { useStoreStore } from './store/storeStore';
|
|
37
|
+
export { useCart } from './hooks/useCart';
|
|
38
|
+
export { useBackendCart } from './hooks/useBackendCart';
|
|
39
|
+
export { useProductSearch } from './hooks/useProductSearch';
|
|
40
|
+
export { useStorePermissions, STORE_PERMISSIONS, type StorePermission, type StorePermissions, } from './hooks/useStorePermissions';
|
|
41
|
+
export * from './utils';
|
|
42
|
+
export { useBrowseStore, useBrowseStoreWithContext, useLazyBrowseStore, useStoreProductDetails, useLazyStoreProductDetails, useHomeGroupedProducts, useFeaturedProducts, useSearchSuggestions, useLazySearchSuggestions, useTrendingSearches, useFilterOptions, useCategories, useProductReviews, useUserReviewForProduct, useCreateReview, useUpdateReview, useDeleteReview, useMarkReviewHelpful, useMyEntitlements, useCheckEntitlement, useWorkspaceStoreOrders, useMyPublishedProducts, useDeveloperEarnings, } from './hooks/useStoreGraphQL';
|
|
43
|
+
export * from './generated/global-operations';
|
|
44
|
+
export { enTranslations as storeTranslations } from './translations/en';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { useStore as e } from "./providers/StoreProvider.js";
|
|
2
|
+
import { STORE_PERMISSIONS as t, useStorePermissions as n } from "./hooks/useStorePermissions.js";
|
|
3
|
+
import { useStoreStore as r } from "./store/storeStore.js";
|
|
4
|
+
import { AddToCartDocument as i, BrowseStoreDocument as a, CategoriesDocument as o, CheckEntitlementDocument as s, CheckoutDocument as c, ClearCartDocument as l, CreateProductForPublisherDocument as u, CreateReviewDocument as d, CreateStoreOrderDocument as f, DeleteReviewDocument as p, DeveloperEarningsDocument as m, FeaturedProductsDocument as h, FilterOptionsDocument as g, GetCartDocument as _, GetMyOrdersDocument as v, GetMyStoreInstallationsDocument as y, GetProductDocument as b, GetProductsDocument as x, GetStoreAppInstallationDocument as S, HomeGroupedProductsDocument as C, InstallationStatusUpdatedDocument as w, LicenseStatusUpdatedDocument as T, MarkReviewHelpfulDocument as E, MyEntitlementsDocument as D, MyPublishedProductsDocument as O, OrderStatusUpdatedDocument as k, ProductReviewsDocument as A, RecordAppUninstallationDocument as j, RemoveFromCartDocument as M, SearchSuggestionsDocument as N, StoreProductDetailsDocument as P, SubmissionStatusUpdatedDocument as F, TrendingSearchesDocument as I, UpdateCartItemDocument as L, UpdateReviewDocument as R, UserReviewForProductDocument as z, WorkspaceStoreOrdersDocument as B, useAddToCartMutation as V, useBrowseStoreLazyQuery as H, useBrowseStoreQuery as U, useBrowseStoreSuspenseQuery as W, useCategoriesLazyQuery as G, useCategoriesQuery as K, useCategoriesSuspenseQuery as q, useCheckEntitlementLazyQuery as J, useCheckEntitlementQuery as Y, useCheckEntitlementSuspenseQuery as X, useCheckoutMutation as Z, useClearCartMutation as Q, useCreateProductForPublisherMutation as $, useCreateReviewMutation as ee, useCreateStoreOrderMutation as te, useDeleteReviewMutation as ne, useDeveloperEarningsLazyQuery as re, useDeveloperEarningsQuery as ie, useDeveloperEarningsSuspenseQuery as ae, useFeaturedProductsLazyQuery as oe, useFeaturedProductsQuery as se, useFeaturedProductsSuspenseQuery as ce, useFilterOptionsLazyQuery as le, useFilterOptionsQuery as ue, useFilterOptionsSuspenseQuery as de, useGetCartLazyQuery as fe, useGetCartQuery as pe, useGetCartSuspenseQuery as me, useGetMyOrdersLazyQuery as he, useGetMyOrdersQuery as ge, useGetMyOrdersSuspenseQuery as _e, useGetMyStoreInstallationsLazyQuery as ve, useGetMyStoreInstallationsQuery as ye, useGetMyStoreInstallationsSuspenseQuery as be, useGetProductLazyQuery as xe, useGetProductQuery as Se, useGetProductSuspenseQuery as Ce, useGetProductsLazyQuery as we, useGetProductsQuery as Te, useGetProductsSuspenseQuery as Ee, useGetStoreAppInstallationLazyQuery as De, useGetStoreAppInstallationQuery as Oe, useGetStoreAppInstallationSuspenseQuery as ke, useHomeGroupedProductsLazyQuery as Ae, useHomeGroupedProductsQuery as je, useHomeGroupedProductsSuspenseQuery as Me, useInstallationStatusUpdatedSubscription as Ne, useLicenseStatusUpdatedSubscription as Pe, useMarkReviewHelpfulMutation as Fe, useMyEntitlementsLazyQuery as Ie, useMyEntitlementsQuery as Le, useMyEntitlementsSuspenseQuery as Re, useMyPublishedProductsLazyQuery as ze, useMyPublishedProductsQuery as Be, useMyPublishedProductsSuspenseQuery as Ve, useOrderStatusUpdatedSubscription as He, useProductReviewsLazyQuery as Ue, useProductReviewsQuery as We, useProductReviewsSuspenseQuery as Ge, useRecordAppUninstallationMutation as Ke, useRemoveFromCartMutation as qe, useSearchSuggestionsLazyQuery as Je, useSearchSuggestionsQuery as Ye, useSearchSuggestionsSuspenseQuery as Xe, useStoreProductDetailsLazyQuery as Ze, useStoreProductDetailsQuery as Qe, useStoreProductDetailsSuspenseQuery as $e, useSubmissionStatusUpdatedSubscription as et, useTrendingSearchesLazyQuery as tt, useTrendingSearchesQuery as nt, useTrendingSearchesSuspenseQuery as rt, useUpdateCartItemMutation as it, useUpdateReviewMutation as at, useUserReviewForProductLazyQuery as ot, useUserReviewForProductQuery as st, useUserReviewForProductSuspenseQuery as ct, useWorkspaceStoreOrdersLazyQuery as lt, useWorkspaceStoreOrdersQuery as ut, useWorkspaceStoreOrdersSuspenseQuery as dt } from "./generated/global-operations.js";
|
|
5
|
+
import { useBackendCart as ft } from "./hooks/useBackendCart.js";
|
|
6
|
+
import { useCart as pt } from "./hooks/useCart.js";
|
|
7
|
+
import { calculateCartTotals as mt, debounce as ht, formatFileSize as gt, formatNumber as _t, formatPrice as vt, generateCartItemId as yt, getDaysUntilExpiry as bt, getItemTypeName as xt, getPricingModelName as St, getRatingStars as Ct, getStatusColor as wt, isLicenseExpiringSoon as Tt, maskLicenseKey as Et, truncate as Dt, validateLicenseKey as Ot } from "./utils/index.js";
|
|
8
|
+
import { useBrowseStore as kt, useBrowseStoreWithContext as At, useCategories as jt, useCheckEntitlement as Mt, useCreateReview as Nt, useDeleteReview as Pt, useDeveloperEarnings as Ft, useFeaturedProducts as It, useFilterOptions as Lt, useHomeGroupedProducts as Rt, useLazyBrowseStore as zt, useLazySearchSuggestions as Bt, useLazyStoreProductDetails as Vt, useMarkReviewHelpful as Ht, useMyEntitlements as Ut, useMyPublishedProducts as Wt, useProductReviews as Gt, useSearchSuggestions as Kt, useStoreProductDetails as qt, useTrendingSearches as Jt, useUpdateReview as Yt, useUserReviewForProduct as Xt, useWorkspaceStoreOrders as Zt } from "./hooks/useStoreGraphQL.js";
|
|
9
|
+
import { StoreRoot as Qt } from "./StoreRoot.js";
|
|
10
|
+
import { StoreAdminRoot as $t } from "./StoreAdminRoot.js";
|
|
11
|
+
import { useProductSearch as en } from "./hooks/useProductSearch.js";
|
|
12
|
+
import { enTranslations as tn } from "./translations/en.js";
|
|
13
|
+
export { i as AddToCartDocument, a as BrowseStoreDocument, o as CategoriesDocument, s as CheckEntitlementDocument, c as CheckoutDocument, l as ClearCartDocument, u as CreateProductForPublisherDocument, d as CreateReviewDocument, f as CreateStoreOrderDocument, p as DeleteReviewDocument, m as DeveloperEarningsDocument, h as FeaturedProductsDocument, g as FilterOptionsDocument, _ as GetCartDocument, v as GetMyOrdersDocument, y as GetMyStoreInstallationsDocument, b as GetProductDocument, x as GetProductsDocument, S as GetStoreAppInstallationDocument, C as HomeGroupedProductsDocument, w as InstallationStatusUpdatedDocument, T as LicenseStatusUpdatedDocument, E as MarkReviewHelpfulDocument, D as MyEntitlementsDocument, O as MyPublishedProductsDocument, k as OrderStatusUpdatedDocument, A as ProductReviewsDocument, j as RecordAppUninstallationDocument, M as RemoveFromCartDocument, t as STORE_PERMISSIONS, N as SearchSuggestionsDocument, $t as StoreAdminRoot, P as StoreProductDetailsDocument, Qt as StoreRoot, F as SubmissionStatusUpdatedDocument, I as TrendingSearchesDocument, L as UpdateCartItemDocument, R as UpdateReviewDocument, z as UserReviewForProductDocument, B as WorkspaceStoreOrdersDocument, mt as calculateCartTotals, ht as debounce, gt as formatFileSize, _t as formatNumber, vt as formatPrice, yt as generateCartItemId, bt as getDaysUntilExpiry, xt as getItemTypeName, St as getPricingModelName, Ct as getRatingStars, wt as getStatusColor, Tt as isLicenseExpiringSoon, Et as maskLicenseKey, tn as storeTranslations, Dt as truncate, V as useAddToCartMutation, ft as useBackendCart, kt as useBrowseStore, H as useBrowseStoreLazyQuery, U as useBrowseStoreQuery, W as useBrowseStoreSuspenseQuery, At as useBrowseStoreWithContext, pt as useCart, jt as useCategories, G as useCategoriesLazyQuery, K as useCategoriesQuery, q as useCategoriesSuspenseQuery, Mt as useCheckEntitlement, J as useCheckEntitlementLazyQuery, Y as useCheckEntitlementQuery, X as useCheckEntitlementSuspenseQuery, Z as useCheckoutMutation, Q as useClearCartMutation, $ as useCreateProductForPublisherMutation, Nt as useCreateReview, ee as useCreateReviewMutation, te as useCreateStoreOrderMutation, Pt as useDeleteReview, ne as useDeleteReviewMutation, Ft as useDeveloperEarnings, re as useDeveloperEarningsLazyQuery, ie as useDeveloperEarningsQuery, ae as useDeveloperEarningsSuspenseQuery, It as useFeaturedProducts, oe as useFeaturedProductsLazyQuery, se as useFeaturedProductsQuery, ce as useFeaturedProductsSuspenseQuery, Lt as useFilterOptions, le as useFilterOptionsLazyQuery, ue as useFilterOptionsQuery, de as useFilterOptionsSuspenseQuery, fe as useGetCartLazyQuery, pe as useGetCartQuery, me as useGetCartSuspenseQuery, he as useGetMyOrdersLazyQuery, ge as useGetMyOrdersQuery, _e as useGetMyOrdersSuspenseQuery, ve as useGetMyStoreInstallationsLazyQuery, ye as useGetMyStoreInstallationsQuery, be as useGetMyStoreInstallationsSuspenseQuery, xe as useGetProductLazyQuery, Se as useGetProductQuery, Ce as useGetProductSuspenseQuery, we as useGetProductsLazyQuery, Te as useGetProductsQuery, Ee as useGetProductsSuspenseQuery, De as useGetStoreAppInstallationLazyQuery, Oe as useGetStoreAppInstallationQuery, ke as useGetStoreAppInstallationSuspenseQuery, Rt as useHomeGroupedProducts, Ae as useHomeGroupedProductsLazyQuery, je as useHomeGroupedProductsQuery, Me as useHomeGroupedProductsSuspenseQuery, Ne as useInstallationStatusUpdatedSubscription, zt as useLazyBrowseStore, Bt as useLazySearchSuggestions, Vt as useLazyStoreProductDetails, Pe as useLicenseStatusUpdatedSubscription, Ht as useMarkReviewHelpful, Fe as useMarkReviewHelpfulMutation, Ut as useMyEntitlements, Ie as useMyEntitlementsLazyQuery, Le as useMyEntitlementsQuery, Re as useMyEntitlementsSuspenseQuery, Wt as useMyPublishedProducts, ze as useMyPublishedProductsLazyQuery, Be as useMyPublishedProductsQuery, Ve as useMyPublishedProductsSuspenseQuery, He as useOrderStatusUpdatedSubscription, Gt as useProductReviews, Ue as useProductReviewsLazyQuery, We as useProductReviewsQuery, Ge as useProductReviewsSuspenseQuery, en as useProductSearch, Ke as useRecordAppUninstallationMutation, qe as useRemoveFromCartMutation, Kt as useSearchSuggestions, Je as useSearchSuggestionsLazyQuery, Ye as useSearchSuggestionsQuery, Xe as useSearchSuggestionsSuspenseQuery, e as useStore, n as useStorePermissions, qt as useStoreProductDetails, Ze as useStoreProductDetailsLazyQuery, Qe as useStoreProductDetailsQuery, $e as useStoreProductDetailsSuspenseQuery, r as useStoreStore, et as useSubmissionStatusUpdatedSubscription, Jt as useTrendingSearches, tt as useTrendingSearchesLazyQuery, nt as useTrendingSearchesQuery, rt as useTrendingSearchesSuspenseQuery, it as useUpdateCartItemMutation, Yt as useUpdateReview, at as useUpdateReviewMutation, Xt as useUserReviewForProduct, ot as useUserReviewForProductLazyQuery, st as useUserReviewForProductQuery, ct as useUserReviewForProductSuspenseQuery, Zt as useWorkspaceStoreOrders, lt as useWorkspaceStoreOrdersLazyQuery, ut as useWorkspaceStoreOrdersQuery, dt as useWorkspaceStoreOrdersSuspenseQuery, Ot as validateLicenseKey };
|