dify/web/utils/marketplace-site-track.ts
Coding On Star cb6c04637b
feat(web): add marketplace creator profiles and homepage redesign (#41538)
Co-authored-by: zxhlyh <jasonapring2015@outlook.com>
Co-authored-by: fatelei <fatelei@gmail.com>
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
Co-authored-by: CodingOnStar <hanxujiang@dify.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: 姜涵煦 <hanxujiang@jianghanxudeMacBook-Pro-2.local>
Co-authored-by: L1nSn0w <l1nsn0w@qq.com>
Co-authored-by: yyh <92089059+lyzno1@users.noreply.github.com>
2026-09-04 08:09:45 +00:00

88 lines
2.4 KiB
TypeScript

/**
* Standalone Marketplace host contract.
*
* The Dify console never stamps `data-is-marketplace` or assigns
* `window.__marketplaceTracking__`, so every helper here is a no-op in a Dify
* build. The standalone marketplace (dify-marketplace) owns the producer: it
* sets `data-is-marketplace` on `<body>` and injects `__marketplaceTracking__`
* from its analytics runtime. Shared Marketplace UI calls these helpers; the
* host implements the bridge.
*/
type MarketplaceSiteReferrerSection = 'banner' | 'search' | 'list' | 'direct'
type MarketplaceSiteFilter = {
filter_type: 'type_tab' | 'category' | 'language'
selection_mode: 'single' | 'multi'
filter_value: string
selected_values: string[]
}
const isMarketplaceSite = () =>
typeof globalThis.document !== 'undefined' &&
globalThis.document.body?.hasAttribute('data-is-marketplace')
const marketplaceTracking = () => globalThis.window.__marketplaceTracking__
export const trackMarketplaceSiteEvent = (
eventName: string,
properties?: Record<string, unknown>,
) => {
if (!isMarketplaceSite()) return
marketplaceTracking()?.track(eventName, properties)
}
export const rememberMarketplaceSiteReferrer = (
itemId: string,
section: MarketplaceSiteReferrerSection,
) => {
if (!isMarketplaceSite()) return
marketplaceTracking()?.rememberReferrer(itemId, section)
}
export const markMarketplaceSiteSearch = (query: string) => {
if (!isMarketplaceSite()) return
marketplaceTracking()?.markSearch(query)
}
export const flushMarketplaceSiteSearch = (resultCount: number) => {
if (!isMarketplaceSite()) return
marketplaceTracking()?.flushSearch(resultCount)
}
export const markMarketplaceSiteFilter = (filter: MarketplaceSiteFilter) => {
if (!isMarketplaceSite()) return
marketplaceTracking()?.markFilter(filter)
}
export const flushMarketplaceSiteFilter = (resultCount: number) => {
if (!isMarketplaceSite()) return
marketplaceTracking()?.flushFilter(resultCount)
}
export const trackMarketplaceSiteCardClick = ({
itemId,
itemType,
itemName,
section,
}: {
itemId: string
itemType: 'plugin' | 'template'
itemName: string
section: string
}) => {
rememberMarketplaceSiteReferrer(itemId, section === 'search' ? 'search' : 'list')
trackMarketplaceSiteEvent('marketplace_card_click', {
click_target: 'card',
item_id: itemId,
item_type: itemType,
item_name: itemName,
section,
})
}