/** * Analysis */ type DateRange = 'past-10-days' | 'past-30-days' | 'past-90-days' | 'year-to-date'; type Frequency = 'daily' | 'weekly' | 'monthly'; type SiteRawDataPoint = { date: string; week: string; view_count: number; user_count: number; session_count: number; engaged_session_count: number; engagement_rate: number; }; type SiteRawDataPoints = { [key: string]: SiteRawDataPoint; // key is date }; type AverageMetric = 'engagement_rate'; type SiteDataMetric = 'view_count' | 'user_count' | 'session_count' | 'engaged_session_count' | 'engagement_rate'; type PageDataMetric = 'view_count' | 'engaged_count' | 'view_time_avg_ms' | 'landing_count'; type AudienceMetric = 'device' | 'source' | 'new_returning' | 'segment' | 'utm_campaign' | 'utm_source' | 'utm_medium' | 'other_campaign'; type PageRawDataPoint = { date: string; week: number; view_count?: number; engaged_count?: number; landing_count?: number; view_time_avg_ms?: number; }; type PageRawDataPoints = { [key: string]: PageRawDataPoint; // key is date }; type ABTestDataMetric = 'view_count' | 'conversion_count' | 'engaged_count' | 'view_time_avg_ms'; type ABTestRawDataPoint = { date: string; week: number; view_count?: number; conversion_count?: number; engaged_count?: number; view_time_avg_ms?: number; }; type ABTestRawDataPoints = { [key: string]: ABTestRawDataPoint; // key is date }; type PersonalizationDataMetric = 'view_count' | 'click_count'; type PersonalizationRawDataPoint = { date: string; week: number; view_count?: number; click_count?: number; }; type PersonalizationRawDataPoints = { [key: string]: PersonalizationRawDataPoint; // key is date }; // internal logic for aggregation type AnalysisFormattedDataPoint = { label: string, day: string, month: string, year: string, week: string, value: number }; type AnalysisGraphDataPoint = { label: string; value: number; count: number; nonZeroCount: number; }; type SiteAnalysisResult = { summaryHeadline: AnalysisSummaryHeadlineProps; summaryRows: AnalysisSummaryRowProps[]; graphData: AnalysisGraphDataPoint[]; hasData: boolean; }; type PageAnalysisResult = { summaryHeadline: AnalysisSummaryHeadlineProps; summaryRows: AnalysisSummaryRowProps[]; graphData: AnalysisGraphDataPoint[]; hasData: boolean; }; type PersonalizationAnalyisResult = { summaryHeadline: AnalysisSummaryHeadlineProps; summaryRows: AnalysisSummaryRowProps[]; graphData: AnalysisGraphDataPoint[]; insights: PersonalizationAnalysisGraphDataInsights; hasData: boolean; }; type ABTestAnalysisResult = { insights: ABTestAnalysisGraphDataInsights; summaryRows: AnalysisSummaryABTableRowProps[]; graphDataA: AnalysisGraphDataPoint[]; graphDataB: AnalysisGraphDataPoint[]; hasData: boolean; }; type AudienceRawDataPoint = { audience: string; value: any; display_value: string; count: number; }; type PieDataPoint = { label: string; value: number; color: string; displayValue: string; } type AudienceAnalysisResult = { pieData: PieDataPoint[]; details: AudiencePieDetailDataPoint[]; annotationLabel: string; annotationValue: string; } type AudiencePieDetailDataPoint = { label: string; count: number; displayCount: string; percentage: number; displayPercentage: string; color: string; subPoints?: AudienceSubPieDetailDataPoint[]; value?: any; }; type AudienceSubPieDetailDataPoint = { label: string; count: number; displayCount: string; percentage: number; displayPercentage: string; onClick?: () => void; } type AudienceInsightsDataPoint = { label: string; count: number; percentage: number; color: string; value: any; }; type AudienceInsights = { totalCount: number; items: AudienceInsightsDataPoint[]; topItem: AudienceInsightsDataPoint; }; type AnalysisGraphDataInsights = { sum: { value: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; }, max: { value: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; }, min: { value: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; } average: { value: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; } } type ABTestAnalysisGraphDataInsights = { sum: { valueA: number; valueAPerViews: number; valueB: number; valueBPerViews: number; winner: 'A' | 'B' | null; winnerTrend?: AnalysisTrendProps; }, max: { valueA: number; valueB: number; winner: 'A' | 'B' | null; winnerTrend?: AnalysisTrendProps; }, min: { valueA: number; valueB: number; winner: 'A' | 'B' | null; winnerTrend?: AnalysisTrendProps; }, average: { valueA: number; valueB: number; winner: 'A' | 'B' | null; winnerTrend?: AnalysisTrendProps; } }; type PersonalizationAnalysisGraphDataInsights = { sum: { value: number; portionOfAllVariants: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; }, max: { value: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; }, min: { value: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; } average: { value: number; trendInPeriod?: AnalysisTrendProps; trendFromPreviousPeriod?: AnalysisTrendProps; } }; /** * Analysis components */ type AnalysisTrendNotation = 'percentage' | 'compact' | 'seconds'; type AnalysisTrendDirection = 'up' | 'down' | 'neutral'; type AnalysisTrendValueRelation = 'scale' | 'parenthesis'; type AnalysisTrendProps = { value: number; value2?: number; notation?: AnalysisTrendNotation; notation2?: AnalysisTrendNotation; direction?: AnalysisTrendDirection; direction2?: AnalysisTrendDirection; relation?: AnalysisTrendValueRelation; }; type AnalysisSummaryHeadlineProps = { value: number|string; label: string; trend?: AnalysisTrendProps; }; type AnalysisSummaryRowProps = { label: string; trend?: AnalysisTrendProps; }; type AnalysisPieDetailProps = { color: string; label: string; value: string; percentage?: string; subPoints?: AudienceSubPieDetailDataPoint[]; }; type AnalysisSummaryABTableRowProps = { label: string; trendA: AnalysisTrendProps; trendB: AnalysisTrendProps; }; type ModalData = { postId: number; title: string; statusLabel: string; isPublished: boolean; permalink: string; date: string; editLink: string; endpointPageOverview: string; hasABTests: boolean; hasPersonalizations: boolean; abTestId: number|null; abTestPublishedAt: string|null; supportsABTesting: boolean; supportsPersonalization: boolean; activeTab: string; }; type SitePersonalizationVariation = { name: string; rule: string; clicks: number; views: number; is_default: boolean; }; type SitePersonalizationReport = { id: number; title: string; type: string; url: string; personalization_count: number; modal: ModalData; analytics: SitePersonalizationVariation[]; }; type SitePersonalization = { success: boolean; overview_30: SitePersonalizationReport[]; overview_365: SitePersonalizationReport[]; }; type LianaAPISettings = { address: string; realm: string; user: string; secret: string; }; type LianaAutomationSettings = { api: LianaAPISettings; channel: ChannelSettings; tracker: TrackerSettings; }; type ChannelSettings = { id: number; pbr?: number; formsend?: number; login?: number; woocommerce?: number; consent?: string | false; }; type TrackerSettings = { forms: string[]; 'wc-user-meta-keys'?: string[]; 'wc-order-meta-keys'?: string[]; }; type FormDataRow = { id: number; name: string; url: string; plugin: { slug: string; name: string; }; lianaMailerConnected: boolean; lianaMailerConfigured: boolean; lianaAutomationConnected: boolean; };