mirror of
https://github.com/langgenius/dify.git
synced 2026-09-05 00:31:19 +08:00
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>
88 lines
2.4 KiB
TypeScript
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,
|
|
})
|
|
}
|