@mobileai/react-native 0.8.16 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +121 -0
- package/lib/module/components/AIAgent.js +248 -53
- package/lib/module/components/AIAgent.js.map +1 -1
- package/lib/module/components/AIZone.js +140 -0
- package/lib/module/components/AIZone.js.map +1 -0
- package/lib/module/components/AgentErrorBoundary.js +9 -0
- package/lib/module/components/AgentErrorBoundary.js.map +1 -1
- package/lib/module/components/HighlightOverlay.js +138 -0
- package/lib/module/components/HighlightOverlay.js.map +1 -0
- package/lib/module/components/ProactiveHint.js +138 -0
- package/lib/module/components/ProactiveHint.js.map +1 -0
- package/lib/module/components/cards/InfoCard.js +65 -0
- package/lib/module/components/cards/InfoCard.js.map +1 -0
- package/lib/module/components/cards/ReviewSummary.js +74 -0
- package/lib/module/components/cards/ReviewSummary.js.map +1 -0
- package/lib/module/core/AgentRuntime.js +16 -3
- package/lib/module/core/AgentRuntime.js.map +1 -1
- package/lib/module/core/FiberTreeWalker.js +62 -85
- package/lib/module/core/FiberTreeWalker.js.map +1 -1
- package/lib/module/core/IdleDetector.js +51 -0
- package/lib/module/core/IdleDetector.js.map +1 -0
- package/lib/module/core/ZoneRegistry.js +47 -0
- package/lib/module/core/ZoneRegistry.js.map +1 -0
- package/lib/module/core/systemPrompt.js +2 -0
- package/lib/module/core/systemPrompt.js.map +1 -1
- package/lib/module/index.js +21 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/services/AudioOutputService.js +10 -0
- package/lib/module/services/AudioOutputService.js.map +1 -1
- package/lib/module/services/flags/FlagService.js +117 -0
- package/lib/module/services/flags/FlagService.js.map +1 -0
- package/lib/module/services/telemetry/MobileAI.js +66 -0
- package/lib/module/services/telemetry/MobileAI.js.map +1 -0
- package/lib/module/services/telemetry/PiiScrubber.js +17 -0
- package/lib/module/services/telemetry/PiiScrubber.js.map +1 -0
- package/lib/module/services/telemetry/TelemetryService.js +260 -0
- package/lib/module/services/telemetry/TelemetryService.js.map +1 -0
- package/lib/module/services/telemetry/TouchAutoCapture.js +159 -0
- package/lib/module/services/telemetry/TouchAutoCapture.js.map +1 -0
- package/lib/module/services/telemetry/device.js +19 -0
- package/lib/module/services/telemetry/device.js.map +1 -0
- package/lib/module/services/telemetry/index.js +9 -0
- package/lib/module/services/telemetry/index.js.map +1 -0
- package/lib/module/services/telemetry/types.js +2 -0
- package/lib/module/services/telemetry/types.js.map +1 -0
- package/lib/module/support/CSATSurvey.js +273 -0
- package/lib/module/support/CSATSurvey.js.map +1 -0
- package/lib/module/support/EscalationSocket.js +92 -0
- package/lib/module/support/EscalationSocket.js.map +1 -0
- package/lib/module/support/SupportGreeting.js +142 -0
- package/lib/module/support/SupportGreeting.js.map +1 -0
- package/lib/module/support/escalateTool.js +120 -0
- package/lib/module/support/escalateTool.js.map +1 -0
- package/lib/module/support/index.js +18 -0
- package/lib/module/support/index.js.map +1 -0
- package/lib/module/support/supportPrompt.js +47 -0
- package/lib/module/support/supportPrompt.js.map +1 -0
- package/lib/module/support/types.js +2 -0
- package/lib/module/support/types.js.map +1 -0
- package/lib/module/tools/guideTool.js +61 -0
- package/lib/module/tools/guideTool.js.map +1 -0
- package/lib/module/tools/index.js +3 -0
- package/lib/module/tools/index.js.map +1 -1
- package/lib/module/tools/restoreTool.js +31 -0
- package/lib/module/tools/restoreTool.js.map +1 -0
- package/lib/module/tools/simplifyTool.js +31 -0
- package/lib/module/tools/simplifyTool.js.map +1 -0
- package/lib/module/types/jsx.d.js +4 -0
- package/lib/module/types/jsx.d.js.map +1 -0
- package/lib/typescript/src/components/AIAgent.d.ts +21 -2
- package/lib/typescript/src/components/AIAgent.d.ts.map +1 -1
- package/lib/typescript/src/components/AIZone.d.ts +16 -0
- package/lib/typescript/src/components/AIZone.d.ts.map +1 -0
- package/lib/typescript/src/components/AgentErrorBoundary.d.ts +1 -0
- package/lib/typescript/src/components/AgentErrorBoundary.d.ts.map +1 -1
- package/lib/typescript/src/components/HighlightOverlay.d.ts +10 -0
- package/lib/typescript/src/components/HighlightOverlay.d.ts.map +1 -0
- package/lib/typescript/src/components/ProactiveHint.d.ts +10 -0
- package/lib/typescript/src/components/ProactiveHint.d.ts.map +1 -0
- package/lib/typescript/src/components/cards/InfoCard.d.ts +19 -0
- package/lib/typescript/src/components/cards/InfoCard.d.ts.map +1 -0
- package/lib/typescript/src/components/cards/ReviewSummary.d.ts +19 -0
- package/lib/typescript/src/components/cards/ReviewSummary.d.ts.map +1 -0
- package/lib/typescript/src/core/AgentRuntime.d.ts +1 -0
- package/lib/typescript/src/core/AgentRuntime.d.ts.map +1 -1
- package/lib/typescript/src/core/FiberTreeWalker.d.ts.map +1 -1
- package/lib/typescript/src/core/IdleDetector.d.ts +27 -0
- package/lib/typescript/src/core/IdleDetector.d.ts.map +1 -0
- package/lib/typescript/src/core/ZoneRegistry.d.ts +13 -0
- package/lib/typescript/src/core/ZoneRegistry.d.ts.map +1 -0
- package/lib/typescript/src/core/systemPrompt.d.ts.map +1 -1
- package/lib/typescript/src/core/types.d.ts +54 -0
- package/lib/typescript/src/core/types.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +5 -0
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/services/AudioOutputService.d.ts.map +1 -1
- package/lib/typescript/src/services/flags/FlagService.d.ts +25 -0
- package/lib/typescript/src/services/flags/FlagService.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/MobileAI.d.ts +38 -0
- package/lib/typescript/src/services/telemetry/MobileAI.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/PiiScrubber.d.ts +6 -0
- package/lib/typescript/src/services/telemetry/PiiScrubber.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/TelemetryService.d.ts +49 -0
- package/lib/typescript/src/services/telemetry/TelemetryService.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/TouchAutoCapture.d.ts +28 -0
- package/lib/typescript/src/services/telemetry/TouchAutoCapture.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/device.d.ts +7 -0
- package/lib/typescript/src/services/telemetry/device.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/index.d.ts +7 -0
- package/lib/typescript/src/services/telemetry/index.d.ts.map +1 -0
- package/lib/typescript/src/services/telemetry/types.d.ts +50 -0
- package/lib/typescript/src/services/telemetry/types.d.ts.map +1 -0
- package/lib/typescript/src/support/CSATSurvey.d.ts +20 -0
- package/lib/typescript/src/support/CSATSurvey.d.ts.map +1 -0
- package/lib/typescript/src/support/EscalationSocket.d.ts +38 -0
- package/lib/typescript/src/support/EscalationSocket.d.ts.map +1 -0
- package/lib/typescript/src/support/SupportGreeting.d.ts +19 -0
- package/lib/typescript/src/support/SupportGreeting.d.ts.map +1 -0
- package/lib/typescript/src/support/escalateTool.d.ts +25 -0
- package/lib/typescript/src/support/escalateTool.d.ts.map +1 -0
- package/lib/typescript/src/support/index.d.ts +11 -0
- package/lib/typescript/src/support/index.d.ts.map +1 -0
- package/lib/typescript/src/support/supportPrompt.d.ts +12 -0
- package/lib/typescript/src/support/supportPrompt.d.ts.map +1 -0
- package/lib/typescript/src/support/types.d.ts +114 -0
- package/lib/typescript/src/support/types.d.ts.map +1 -0
- package/lib/typescript/src/tools/guideTool.d.ts +4 -0
- package/lib/typescript/src/tools/guideTool.d.ts.map +1 -0
- package/lib/typescript/src/tools/index.d.ts +3 -0
- package/lib/typescript/src/tools/index.d.ts.map +1 -1
- package/lib/typescript/src/tools/restoreTool.d.ts +3 -0
- package/lib/typescript/src/tools/restoreTool.d.ts.map +1 -0
- package/lib/typescript/src/tools/simplifyTool.d.ts +3 -0
- package/lib/typescript/src/tools/simplifyTool.d.ts.map +1 -0
- package/lib/typescript/src/tools/types.d.ts +2 -0
- package/lib/typescript/src/tools/types.d.ts.map +1 -1
- package/package.json +5 -1
- package/src/components/AIAgent.tsx +253 -15
- package/src/components/AIZone.tsx +147 -0
- package/src/components/AgentErrorBoundary.tsx +10 -0
- package/src/components/HighlightOverlay.tsx +136 -0
- package/src/components/ProactiveHint.tsx +145 -0
- package/src/components/cards/InfoCard.tsx +58 -0
- package/src/components/cards/ReviewSummary.tsx +76 -0
- package/src/core/AgentRuntime.ts +18 -0
- package/src/core/FiberTreeWalker.ts +71 -93
- package/src/core/IdleDetector.ts +72 -0
- package/src/core/ZoneRegistry.ts +44 -0
- package/src/core/systemPrompt.ts +2 -0
- package/src/core/types.ts +60 -0
- package/src/index.ts +31 -0
- package/src/services/AudioOutputService.ts +13 -0
- package/src/services/flags/FlagService.ts +137 -0
- package/src/services/telemetry/MobileAI.ts +66 -0
- package/src/services/telemetry/PiiScrubber.ts +17 -0
- package/src/services/telemetry/TelemetryService.ts +291 -0
- package/src/services/telemetry/TouchAutoCapture.ts +165 -0
- package/src/services/telemetry/device.ts +16 -0
- package/src/services/telemetry/index.ts +13 -0
- package/src/services/telemetry/types.ts +75 -0
- package/src/support/CSATSurvey.tsx +304 -0
- package/src/support/EscalationSocket.ts +113 -0
- package/src/support/SupportGreeting.tsx +161 -0
- package/src/support/escalateTool.ts +134 -0
- package/src/support/index.ts +27 -0
- package/src/support/supportPrompt.ts +55 -0
- package/src/support/types.ts +141 -0
- package/src/tools/guideTool.ts +67 -0
- package/src/tools/index.ts +3 -0
- package/src/tools/restoreTool.ts +33 -0
- package/src/tools/simplifyTool.ts +33 -0
- package/src/tools/types.ts +2 -0
- package/src/types/jsx.d.ts +20 -0
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { useRef, useEffect, useContext, useState } from 'react';
|
|
4
|
+
import { View, StyleSheet, Pressable, Text } from 'react-native';
|
|
5
|
+
import { ZoneRegistryContext } from "../core/ZoneRegistry.js";
|
|
6
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
7
|
+
// React context to broadcast simplified state down strictly to children
|
|
8
|
+
export const AIZoneStateContext = /*#__PURE__*/React.createContext({
|
|
9
|
+
simplified: false
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Declarative boundary that grants the AI permission to modify its subtree.
|
|
14
|
+
* Has zero visual impact by default.
|
|
15
|
+
*/
|
|
16
|
+
export function AIZone({
|
|
17
|
+
id,
|
|
18
|
+
allowHighlight,
|
|
19
|
+
allowInjectHint,
|
|
20
|
+
allowSimplify,
|
|
21
|
+
allowInjectCard,
|
|
22
|
+
templates,
|
|
23
|
+
children,
|
|
24
|
+
style
|
|
25
|
+
}) {
|
|
26
|
+
const zoneRef = useRef(null);
|
|
27
|
+
const registry = useContext(ZoneRegistryContext);
|
|
28
|
+
|
|
29
|
+
// State managed by AI tools
|
|
30
|
+
const [simplified, setSimplified] = useState(false);
|
|
31
|
+
const [injectedCard, setInjectedCard] = useState(null);
|
|
32
|
+
useEffect(() => {
|
|
33
|
+
// Register zone permissions on mount
|
|
34
|
+
registry.register({
|
|
35
|
+
id,
|
|
36
|
+
allowHighlight,
|
|
37
|
+
allowInjectHint,
|
|
38
|
+
allowSimplify,
|
|
39
|
+
allowInjectCard,
|
|
40
|
+
templates
|
|
41
|
+
}, zoneRef);
|
|
42
|
+
|
|
43
|
+
// Unregister on unmount
|
|
44
|
+
return () => registry.unregister(id);
|
|
45
|
+
}, [id, allowHighlight, allowInjectHint, allowSimplify, allowInjectCard, templates, registry]);
|
|
46
|
+
|
|
47
|
+
// If the zone exposes an API to manipulate itself locally (outside of AI),
|
|
48
|
+
// we would attach it to the ref or a secondary context. For now, the tools
|
|
49
|
+
// will dispatch events or we can expose a global setter.
|
|
50
|
+
// Actually, the easiest way for the AI tools to mutate this state is
|
|
51
|
+
// an EventEmitter or assigning a controller object to the registry.
|
|
52
|
+
|
|
53
|
+
useEffect(() => {
|
|
54
|
+
// Attach controller to the registry so tools can act on this specific mount instance
|
|
55
|
+
const zone = registry.get(id);
|
|
56
|
+
if (zone) {
|
|
57
|
+
zone._controller = {
|
|
58
|
+
simplify: () => setSimplified(true),
|
|
59
|
+
restore: () => {
|
|
60
|
+
setSimplified(false);
|
|
61
|
+
setInjectedCard(null);
|
|
62
|
+
},
|
|
63
|
+
injectCard: card => setInjectedCard(card)
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}, [id, registry]);
|
|
67
|
+
return /*#__PURE__*/_jsx(View, {
|
|
68
|
+
ref: zoneRef,
|
|
69
|
+
style: style,
|
|
70
|
+
collapsable: false,
|
|
71
|
+
children: /*#__PURE__*/_jsxs(AIZoneStateContext.Provider, {
|
|
72
|
+
value: {
|
|
73
|
+
simplified
|
|
74
|
+
},
|
|
75
|
+
children: [children, injectedCard && /*#__PURE__*/_jsxs(View, {
|
|
76
|
+
style: styles.cardWrapper,
|
|
77
|
+
children: [injectedCard, /*#__PURE__*/_jsx(Pressable, {
|
|
78
|
+
style: styles.closeCardBtn,
|
|
79
|
+
onPress: () => setInjectedCard(null),
|
|
80
|
+
accessibilityLabel: "Dismiss AI Card",
|
|
81
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
82
|
+
style: styles.closeCardText,
|
|
83
|
+
children: "\xD7"
|
|
84
|
+
})
|
|
85
|
+
})]
|
|
86
|
+
}), simplified && /*#__PURE__*/_jsx(Pressable, {
|
|
87
|
+
style: styles.showAllBtn,
|
|
88
|
+
onPress: () => setSimplified(false),
|
|
89
|
+
accessibilityLabel: "Show all options",
|
|
90
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
91
|
+
style: styles.showAllText,
|
|
92
|
+
children: "Show all options"
|
|
93
|
+
})
|
|
94
|
+
})]
|
|
95
|
+
})
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
const styles = StyleSheet.create({
|
|
99
|
+
cardWrapper: {
|
|
100
|
+
marginVertical: 12,
|
|
101
|
+
position: 'relative',
|
|
102
|
+
backgroundColor: '#fff',
|
|
103
|
+
borderRadius: 8,
|
|
104
|
+
shadowColor: '#000',
|
|
105
|
+
shadowOpacity: 0.1,
|
|
106
|
+
shadowRadius: 10,
|
|
107
|
+
elevation: 3
|
|
108
|
+
},
|
|
109
|
+
closeCardBtn: {
|
|
110
|
+
position: 'absolute',
|
|
111
|
+
top: -8,
|
|
112
|
+
right: -8,
|
|
113
|
+
backgroundColor: '#444',
|
|
114
|
+
width: 24,
|
|
115
|
+
height: 24,
|
|
116
|
+
borderRadius: 12,
|
|
117
|
+
alignItems: 'center',
|
|
118
|
+
justifyContent: 'center',
|
|
119
|
+
zIndex: 10
|
|
120
|
+
},
|
|
121
|
+
closeCardText: {
|
|
122
|
+
color: '#fff',
|
|
123
|
+
fontSize: 14,
|
|
124
|
+
fontWeight: 'bold'
|
|
125
|
+
},
|
|
126
|
+
showAllBtn: {
|
|
127
|
+
marginTop: 8,
|
|
128
|
+
paddingVertical: 10,
|
|
129
|
+
alignItems: 'center',
|
|
130
|
+
justifyContent: 'center',
|
|
131
|
+
backgroundColor: '#f0f0f0',
|
|
132
|
+
borderRadius: 8
|
|
133
|
+
},
|
|
134
|
+
showAllText: {
|
|
135
|
+
color: '#0066cc',
|
|
136
|
+
fontSize: 14,
|
|
137
|
+
fontWeight: '500'
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=AIZone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useRef","useEffect","useContext","useState","View","StyleSheet","Pressable","Text","ZoneRegistryContext","jsx","_jsx","jsxs","_jsxs","AIZoneStateContext","createContext","simplified","AIZone","id","allowHighlight","allowInjectHint","allowSimplify","allowInjectCard","templates","children","style","zoneRef","registry","setSimplified","injectedCard","setInjectedCard","register","unregister","zone","get","_controller","simplify","restore","injectCard","card","ref","collapsable","Provider","value","styles","cardWrapper","closeCardBtn","onPress","accessibilityLabel","closeCardText","showAllBtn","showAllText","create","marginVertical","position","backgroundColor","borderRadius","shadowColor","shadowOpacity","shadowRadius","elevation","top","right","width","height","alignItems","justifyContent","zIndex","color","fontSize","fontWeight","marginTop","paddingVertical"],"sourceRoot":"../../../src","sources":["components/AIZone.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -30,6 +30,15 @@ export class AgentErrorBoundary extends React.Component {
|
|
|
30
30
|
const componentStack = errorInfo?.componentStack || '';
|
|
31
31
|
logger.warn('AgentErrorBoundary', `🛡️ Caught rendering error: ${error.message}\n${componentStack}`);
|
|
32
32
|
this.props.onError?.(error, componentStack);
|
|
33
|
+
|
|
34
|
+
// Track the render error silently in analytics
|
|
35
|
+
if (this.props.telemetryRef?.current?.track) {
|
|
36
|
+
this.props.telemetryRef.current.track('render_error', {
|
|
37
|
+
message: error.message,
|
|
38
|
+
component: componentStack?.split('\n')[1]?.trim() ?? 'unknown',
|
|
39
|
+
screen: this.props.telemetryRef.current.screen
|
|
40
|
+
});
|
|
41
|
+
}
|
|
33
42
|
}
|
|
34
43
|
componentDidUpdate(_prevProps, prevState) {
|
|
35
44
|
// Auto-recover: reset error state after brief delay to remount children
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","logger","AgentErrorBoundary","Component","state","hasError","resetTimer","getDerivedStateFromError","_error","componentDidCatch","error","errorInfo","componentStack","warn","message","props","onError","componentDidUpdate","_prevProps","prevState","setTimeout","setState","componentWillUnmount","clearTimeout","render","children"],"sourceRoot":"../../../src","sources":["components/AgentErrorBoundary.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,QAAQ,oBAAiB;
|
|
1
|
+
{"version":3,"names":["React","logger","AgentErrorBoundary","Component","state","hasError","resetTimer","getDerivedStateFromError","_error","componentDidCatch","error","errorInfo","componentStack","warn","message","props","onError","telemetryRef","current","track","component","split","trim","screen","componentDidUpdate","_prevProps","prevState","setTimeout","setState","componentWillUnmount","clearTimeout","render","children"],"sourceRoot":"../../../src","sources":["components/AgentErrorBoundary.tsx"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,QAAQ,oBAAiB;AAaxC,OAAO,MAAMC,kBAAkB,SAASF,KAAK,CAACG,SAAS,CAAe;EACpEC,KAAK,GAAU;IAAEC,QAAQ,EAAE;EAAM,CAAC;EAC1BC,UAAU,GAAyC,IAAI;EAE/D,OAAOC,wBAAwBA,CAACC,MAAa,EAAS;IACpD,OAAO;MAAEH,QAAQ,EAAE;IAAK,CAAC;EAC3B;EAEAI,iBAAiBA,CAACC,KAAY,EAAEC,SAA0B,EAAQ;IAChE,MAAMC,cAAc,GAAGD,SAAS,EAAEC,cAAc,IAAI,EAAE;IACtDX,MAAM,CAACY,IAAI,CACT,oBAAoB,EACpB,+BAA+BH,KAAK,CAACI,OAAO,KAAKF,cAAc,EACjE,CAAC;IACD,IAAI,CAACG,KAAK,CAACC,OAAO,GAAGN,KAAK,EAAEE,cAAc,CAAC;;IAE3C;IACA,IAAI,IAAI,CAACG,KAAK,CAACE,YAAY,EAAEC,OAAO,EAAEC,KAAK,EAAE;MAC3C,IAAI,CAACJ,KAAK,CAACE,YAAY,CAACC,OAAO,CAACC,KAAK,CAAC,cAAc,EAAE;QACpDL,OAAO,EAAEJ,KAAK,CAACI,OAAO;QACtBM,SAAS,EAAER,cAAc,EAAES,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAEC,IAAI,CAAC,CAAC,IAAI,SAAS;QAC9DC,MAAM,EAAE,IAAI,CAACR,KAAK,CAACE,YAAY,CAACC,OAAO,CAACK;MAC1C,CAAC,CAAC;IACJ;EACF;EAEAC,kBAAkBA,CAACC,UAAiB,EAAEC,SAAgB,EAAQ;IAC5D;IACA,IAAI,IAAI,CAACtB,KAAK,CAACC,QAAQ,IAAI,CAACqB,SAAS,CAACrB,QAAQ,EAAE;MAC9C,IAAI,CAACC,UAAU,GAAGqB,UAAU,CAAC,MAAM;QACjC,IAAI,CAACC,QAAQ,CAAC;UAAEvB,QAAQ,EAAE;QAAM,CAAC,CAAC;MACpC,CAAC,EAAE,EAAE,CAAC;IACR;EACF;EAEAwB,oBAAoBA,CAAA,EAAS;IAC3B,IAAI,IAAI,CAACvB,UAAU,EAAE;MACnBwB,YAAY,CAAC,IAAI,CAACxB,UAAU,CAAC;IAC/B;EACF;EAEAyB,MAAMA,CAAA,EAAoB;IACxB,IAAI,IAAI,CAAC3B,KAAK,CAACC,QAAQ,EAAE;MACvB;MACA;MACA,OAAO,IAAI;IACb;IACA,OAAO,IAAI,CAACU,KAAK,CAACiB,QAAQ;EAC5B;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { useEffect, useState, useRef } from 'react';
|
|
4
|
+
import { View, Text, StyleSheet, Animated, Pressable, DeviceEventEmitter } from 'react-native';
|
|
5
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
|
+
export function HighlightOverlay() {
|
|
7
|
+
const [highlight, setHighlight] = useState(null);
|
|
8
|
+
const pulseAnim = useRef(new Animated.Value(1)).current;
|
|
9
|
+
const timerRef = useRef(null);
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
const sub = DeviceEventEmitter.addListener('MOBILE_AI_HIGHLIGHT', data => {
|
|
12
|
+
if (timerRef.current) clearTimeout(timerRef.current);
|
|
13
|
+
setHighlight(data);
|
|
14
|
+
if (data) {
|
|
15
|
+
// Start pulsing ring
|
|
16
|
+
pulseAnim.setValue(1);
|
|
17
|
+
Animated.loop(Animated.sequence([Animated.timing(pulseAnim, {
|
|
18
|
+
toValue: 1.2,
|
|
19
|
+
duration: 800,
|
|
20
|
+
useNativeDriver: true
|
|
21
|
+
}), Animated.timing(pulseAnim, {
|
|
22
|
+
toValue: 1,
|
|
23
|
+
duration: 800,
|
|
24
|
+
useNativeDriver: true
|
|
25
|
+
})])).start();
|
|
26
|
+
|
|
27
|
+
// Auto-dismiss
|
|
28
|
+
const ms = data.autoRemoveAfterMs || 5000;
|
|
29
|
+
timerRef.current = setTimeout(() => {
|
|
30
|
+
setHighlight(null);
|
|
31
|
+
}, ms);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
return () => sub.remove();
|
|
35
|
+
}, [pulseAnim]);
|
|
36
|
+
if (!highlight) return null;
|
|
37
|
+
const {
|
|
38
|
+
pageX,
|
|
39
|
+
pageY,
|
|
40
|
+
width,
|
|
41
|
+
height,
|
|
42
|
+
message
|
|
43
|
+
} = highlight;
|
|
44
|
+
|
|
45
|
+
// Calculate tooltip position (prefer top, fallback to bottom if too close to top edge)
|
|
46
|
+
const isTooHigh = pageY < 60;
|
|
47
|
+
const tooltipTop = isTooHigh ? pageY + height + 12 : pageY - 45;
|
|
48
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
49
|
+
style: StyleSheet.absoluteFill,
|
|
50
|
+
pointerEvents: "box-none",
|
|
51
|
+
children: [/*#__PURE__*/_jsx(Pressable, {
|
|
52
|
+
style: StyleSheet.absoluteFill,
|
|
53
|
+
onPress: () => setHighlight(null)
|
|
54
|
+
}), /*#__PURE__*/_jsx(Animated.View, {
|
|
55
|
+
style: [styles.ring, {
|
|
56
|
+
left: pageX - 4,
|
|
57
|
+
top: pageY - 4,
|
|
58
|
+
width: width + 8,
|
|
59
|
+
height: height + 8,
|
|
60
|
+
transform: [{
|
|
61
|
+
scale: pulseAnim
|
|
62
|
+
}]
|
|
63
|
+
}],
|
|
64
|
+
pointerEvents: "none"
|
|
65
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
66
|
+
style: [styles.tooltip, {
|
|
67
|
+
top: tooltipTop
|
|
68
|
+
}],
|
|
69
|
+
pointerEvents: "none",
|
|
70
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
71
|
+
style: styles.message,
|
|
72
|
+
children: message
|
|
73
|
+
}), /*#__PURE__*/_jsx(View, {
|
|
74
|
+
style: isTooHigh ? styles.arrowUp : styles.arrowDown
|
|
75
|
+
})]
|
|
76
|
+
})]
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const styles = StyleSheet.create({
|
|
80
|
+
ring: {
|
|
81
|
+
position: 'absolute',
|
|
82
|
+
borderWidth: 3,
|
|
83
|
+
borderColor: '#007AFF',
|
|
84
|
+
// iOS blue
|
|
85
|
+
borderRadius: 8,
|
|
86
|
+
backgroundColor: 'rgba(0, 122, 255, 0.15)' // Very subtle fill
|
|
87
|
+
},
|
|
88
|
+
tooltip: {
|
|
89
|
+
position: 'absolute',
|
|
90
|
+
alignSelf: 'center',
|
|
91
|
+
backgroundColor: '#007AFF',
|
|
92
|
+
paddingHorizontal: 12,
|
|
93
|
+
paddingVertical: 8,
|
|
94
|
+
borderRadius: 8,
|
|
95
|
+
maxWidth: '80%',
|
|
96
|
+
shadowColor: '#000',
|
|
97
|
+
shadowOpacity: 0.2,
|
|
98
|
+
shadowOffset: {
|
|
99
|
+
width: 0,
|
|
100
|
+
height: 2
|
|
101
|
+
},
|
|
102
|
+
shadowRadius: 4,
|
|
103
|
+
elevation: 4
|
|
104
|
+
},
|
|
105
|
+
message: {
|
|
106
|
+
color: '#fff',
|
|
107
|
+
fontSize: 14,
|
|
108
|
+
fontWeight: 'bold',
|
|
109
|
+
textAlign: 'center'
|
|
110
|
+
},
|
|
111
|
+
arrowDown: {
|
|
112
|
+
position: 'absolute',
|
|
113
|
+
bottom: -6,
|
|
114
|
+
alignSelf: 'center',
|
|
115
|
+
width: 0,
|
|
116
|
+
height: 0,
|
|
117
|
+
borderLeftWidth: 6,
|
|
118
|
+
borderRightWidth: 6,
|
|
119
|
+
borderTopWidth: 6,
|
|
120
|
+
borderLeftColor: 'transparent',
|
|
121
|
+
borderRightColor: 'transparent',
|
|
122
|
+
borderTopColor: '#007AFF'
|
|
123
|
+
},
|
|
124
|
+
arrowUp: {
|
|
125
|
+
position: 'absolute',
|
|
126
|
+
top: -6,
|
|
127
|
+
alignSelf: 'center',
|
|
128
|
+
width: 0,
|
|
129
|
+
height: 0,
|
|
130
|
+
borderLeftWidth: 6,
|
|
131
|
+
borderRightWidth: 6,
|
|
132
|
+
borderBottomWidth: 6,
|
|
133
|
+
borderLeftColor: 'transparent',
|
|
134
|
+
borderRightColor: 'transparent',
|
|
135
|
+
borderBottomColor: '#007AFF'
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=HighlightOverlay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["useEffect","useState","useRef","View","Text","StyleSheet","Animated","Pressable","DeviceEventEmitter","jsx","_jsx","jsxs","_jsxs","HighlightOverlay","highlight","setHighlight","pulseAnim","Value","current","timerRef","sub","addListener","data","clearTimeout","setValue","loop","sequence","timing","toValue","duration","useNativeDriver","start","ms","autoRemoveAfterMs","setTimeout","remove","pageX","pageY","width","height","message","isTooHigh","tooltipTop","style","absoluteFill","pointerEvents","children","onPress","styles","ring","left","top","transform","scale","tooltip","arrowUp","arrowDown","create","position","borderWidth","borderColor","borderRadius","backgroundColor","alignSelf","paddingHorizontal","paddingVertical","maxWidth","shadowColor","shadowOpacity","shadowOffset","shadowRadius","elevation","color","fontSize","fontWeight","textAlign","bottom","borderLeftWidth","borderRightWidth","borderTopWidth","borderLeftColor","borderRightColor","borderTopColor","borderBottomWidth","borderBottomColor"],"sourceRoot":"../../../src","sources":["components/HighlightOverlay.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import React, { useEffect, useRef } from 'react';
|
|
4
|
+
import { View, Animated, StyleSheet, Text, Pressable } from 'react-native';
|
|
5
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
6
|
+
export function ProactiveHint({
|
|
7
|
+
stage,
|
|
8
|
+
badgeText = "Need help?",
|
|
9
|
+
onDismiss,
|
|
10
|
+
children
|
|
11
|
+
}) {
|
|
12
|
+
const pulseAnim = useRef(new Animated.Value(1)).current;
|
|
13
|
+
const opacityAnim = useRef(new Animated.Value(0)).current;
|
|
14
|
+
const badgeScale = useRef(new Animated.Value(0)).current;
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
// Pulse animation logic
|
|
17
|
+
if (stage === 'pulse') {
|
|
18
|
+
Animated.loop(Animated.sequence([Animated.parallel([Animated.timing(pulseAnim, {
|
|
19
|
+
toValue: 1.3,
|
|
20
|
+
duration: 1500,
|
|
21
|
+
useNativeDriver: true
|
|
22
|
+
}), Animated.timing(opacityAnim, {
|
|
23
|
+
toValue: 0,
|
|
24
|
+
duration: 1500,
|
|
25
|
+
useNativeDriver: true
|
|
26
|
+
})]), Animated.timing(pulseAnim, {
|
|
27
|
+
toValue: 1,
|
|
28
|
+
duration: 0,
|
|
29
|
+
useNativeDriver: true
|
|
30
|
+
}), Animated.timing(opacityAnim, {
|
|
31
|
+
toValue: 0.8,
|
|
32
|
+
duration: 0,
|
|
33
|
+
useNativeDriver: true
|
|
34
|
+
})])).start();
|
|
35
|
+
} else {
|
|
36
|
+
pulseAnim.stopAnimation();
|
|
37
|
+
opacityAnim.stopAnimation();
|
|
38
|
+
pulseAnim.setValue(1);
|
|
39
|
+
opacityAnim.setValue(0);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Badge animation logic
|
|
43
|
+
if (stage === 'badge') {
|
|
44
|
+
Animated.spring(badgeScale, {
|
|
45
|
+
toValue: 1,
|
|
46
|
+
friction: 5,
|
|
47
|
+
tension: 100,
|
|
48
|
+
useNativeDriver: true
|
|
49
|
+
}).start();
|
|
50
|
+
} else {
|
|
51
|
+
badgeScale.setValue(0);
|
|
52
|
+
}
|
|
53
|
+
}, [stage, pulseAnim, opacityAnim, badgeScale]);
|
|
54
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
55
|
+
style: styles.container,
|
|
56
|
+
children: [stage === 'badge' && /*#__PURE__*/_jsxs(Animated.View, {
|
|
57
|
+
style: [styles.badgeContainer, {
|
|
58
|
+
transform: [{
|
|
59
|
+
scale: badgeScale
|
|
60
|
+
}]
|
|
61
|
+
}],
|
|
62
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
63
|
+
style: styles.badgeText,
|
|
64
|
+
children: badgeText
|
|
65
|
+
}), /*#__PURE__*/_jsx(Pressable, {
|
|
66
|
+
hitSlop: 10,
|
|
67
|
+
style: styles.closeButton,
|
|
68
|
+
onPress: onDismiss,
|
|
69
|
+
children: /*#__PURE__*/_jsx(Text, {
|
|
70
|
+
style: styles.closeText,
|
|
71
|
+
children: "\xD7"
|
|
72
|
+
})
|
|
73
|
+
})]
|
|
74
|
+
}), stage === 'pulse' && /*#__PURE__*/_jsx(Animated.View, {
|
|
75
|
+
style: [styles.pulseRing, {
|
|
76
|
+
transform: [{
|
|
77
|
+
scale: pulseAnim
|
|
78
|
+
}],
|
|
79
|
+
opacity: opacityAnim
|
|
80
|
+
}]
|
|
81
|
+
}), children]
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
const styles = StyleSheet.create({
|
|
85
|
+
container: {
|
|
86
|
+
alignItems: 'center',
|
|
87
|
+
justifyContent: 'center'
|
|
88
|
+
},
|
|
89
|
+
pulseRing: {
|
|
90
|
+
position: 'absolute',
|
|
91
|
+
width: 60,
|
|
92
|
+
height: 60,
|
|
93
|
+
borderRadius: 30,
|
|
94
|
+
backgroundColor: '#7B68EE'
|
|
95
|
+
},
|
|
96
|
+
badgeContainer: {
|
|
97
|
+
position: 'absolute',
|
|
98
|
+
bottom: 70,
|
|
99
|
+
// Float above the FAB
|
|
100
|
+
right: 0,
|
|
101
|
+
flexDirection: 'row',
|
|
102
|
+
alignItems: 'center',
|
|
103
|
+
backgroundColor: '#ffffff',
|
|
104
|
+
paddingHorizontal: 12,
|
|
105
|
+
paddingVertical: 8,
|
|
106
|
+
borderRadius: 20,
|
|
107
|
+
shadowColor: '#000',
|
|
108
|
+
shadowOffset: {
|
|
109
|
+
width: 0,
|
|
110
|
+
height: 2
|
|
111
|
+
},
|
|
112
|
+
shadowOpacity: 0.15,
|
|
113
|
+
shadowRadius: 4,
|
|
114
|
+
elevation: 4,
|
|
115
|
+
minWidth: 120
|
|
116
|
+
},
|
|
117
|
+
badgeText: {
|
|
118
|
+
color: '#333333',
|
|
119
|
+
fontSize: 14,
|
|
120
|
+
fontWeight: '500',
|
|
121
|
+
marginRight: 8
|
|
122
|
+
},
|
|
123
|
+
closeButton: {
|
|
124
|
+
justifyContent: 'center',
|
|
125
|
+
alignItems: 'center',
|
|
126
|
+
width: 20,
|
|
127
|
+
height: 20,
|
|
128
|
+
borderRadius: 10,
|
|
129
|
+
backgroundColor: '#f0f0f0'
|
|
130
|
+
},
|
|
131
|
+
closeText: {
|
|
132
|
+
fontSize: 14,
|
|
133
|
+
color: '#666',
|
|
134
|
+
fontWeight: 'bold',
|
|
135
|
+
marginTop: -2
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
//# sourceMappingURL=ProactiveHint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["React","useEffect","useRef","View","Animated","StyleSheet","Text","Pressable","jsx","_jsx","jsxs","_jsxs","ProactiveHint","stage","badgeText","onDismiss","children","pulseAnim","Value","current","opacityAnim","badgeScale","loop","sequence","parallel","timing","toValue","duration","useNativeDriver","start","stopAnimation","setValue","spring","friction","tension","style","styles","container","badgeContainer","transform","scale","hitSlop","closeButton","onPress","closeText","pulseRing","opacity","create","alignItems","justifyContent","position","width","height","borderRadius","backgroundColor","bottom","right","flexDirection","paddingHorizontal","paddingVertical","shadowColor","shadowOffset","shadowOpacity","shadowRadius","elevation","minWidth","color","fontSize","fontWeight","marginRight","marginTop"],"sourceRoot":"../../../src","sources":["components/ProactiveHint.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { View, Text, StyleSheet } from 'react-native';
|
|
4
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
|
+
/**
|
|
6
|
+
* Built-in card template for AI injection.
|
|
7
|
+
*
|
|
8
|
+
* IMPORTANT: displayName must be set explicitly here.
|
|
9
|
+
* In production/minified builds, the function name is mangled (e.g. `a`, `b`),
|
|
10
|
+
* so `injectCardTool` cannot identify templates by inferred name alone.
|
|
11
|
+
* Always look up templates by `T.displayName`, never by `T.name`.
|
|
12
|
+
*/
|
|
13
|
+
export function InfoCard({
|
|
14
|
+
title = 'Info',
|
|
15
|
+
body = '',
|
|
16
|
+
icon = 'ℹ️'
|
|
17
|
+
}) {
|
|
18
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
19
|
+
style: styles.container,
|
|
20
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
21
|
+
style: styles.icon,
|
|
22
|
+
children: icon
|
|
23
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
24
|
+
style: styles.content,
|
|
25
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
26
|
+
style: styles.title,
|
|
27
|
+
children: title
|
|
28
|
+
}), body ? /*#__PURE__*/_jsx(Text, {
|
|
29
|
+
style: styles.body,
|
|
30
|
+
children: body
|
|
31
|
+
}) : null]
|
|
32
|
+
})]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Must be explicit — minification mangles function.name in production builds.
|
|
37
|
+
InfoCard.displayName = 'InfoCard';
|
|
38
|
+
const styles = StyleSheet.create({
|
|
39
|
+
container: {
|
|
40
|
+
flexDirection: 'row',
|
|
41
|
+
alignItems: 'flex-start',
|
|
42
|
+
backgroundColor: '#f0f7ff',
|
|
43
|
+
borderRadius: 10,
|
|
44
|
+
padding: 12,
|
|
45
|
+
gap: 10
|
|
46
|
+
},
|
|
47
|
+
icon: {
|
|
48
|
+
fontSize: 22
|
|
49
|
+
},
|
|
50
|
+
content: {
|
|
51
|
+
flex: 1
|
|
52
|
+
},
|
|
53
|
+
title: {
|
|
54
|
+
fontWeight: '600',
|
|
55
|
+
fontSize: 14,
|
|
56
|
+
color: '#1a1a2e',
|
|
57
|
+
marginBottom: 2
|
|
58
|
+
},
|
|
59
|
+
body: {
|
|
60
|
+
fontSize: 13,
|
|
61
|
+
color: '#444',
|
|
62
|
+
lineHeight: 18
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=InfoCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["View","Text","StyleSheet","jsx","_jsx","jsxs","_jsxs","InfoCard","title","body","icon","style","styles","container","children","content","displayName","create","flexDirection","alignItems","backgroundColor","borderRadius","padding","gap","fontSize","flex","fontWeight","color","marginBottom","lineHeight"],"sourceRoot":"../../../../src","sources":["components/cards/InfoCard.tsx"],"mappings":";;AAAA,SAASA,IAAI,EAAEC,IAAI,EAAEC,UAAU,QAAQ,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAQtD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,QAAQA,CAAC;EAAEC,KAAK,GAAG,MAAM;EAAEC,IAAI,GAAG,EAAE;EAAEC,IAAI,GAAG;AAAoB,CAAC,EAAE;EAClF,oBACEJ,KAAA,CAACN,IAAI;IAACW,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAAC,QAAA,gBAC5BV,IAAA,CAACH,IAAI;MAACU,KAAK,EAAEC,MAAM,CAACF,IAAK;MAAAI,QAAA,EAAEJ;IAAI,CAAO,CAAC,eACvCJ,KAAA,CAACN,IAAI;MAACW,KAAK,EAAEC,MAAM,CAACG,OAAQ;MAAAD,QAAA,gBAC1BV,IAAA,CAACH,IAAI;QAACU,KAAK,EAAEC,MAAM,CAACJ,KAAM;QAAAM,QAAA,EAAEN;MAAK,CAAO,CAAC,EACxCC,IAAI,gBAAGL,IAAA,CAACH,IAAI;QAACU,KAAK,EAAEC,MAAM,CAACH,IAAK;QAAAK,QAAA,EAAEL;MAAI,CAAO,CAAC,GAAG,IAAI;IAAA,CAClD,CAAC;EAAA,CACH,CAAC;AAEX;;AAEA;AACAF,QAAQ,CAACS,WAAW,GAAG,UAAU;AAEjC,MAAMJ,MAAM,GAAGV,UAAU,CAACe,MAAM,CAAC;EAC/BJ,SAAS,EAAE;IACTK,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,YAAY;IACxBC,eAAe,EAAE,SAAS;IAC1BC,YAAY,EAAE,EAAE;IAChBC,OAAO,EAAE,EAAE;IACXC,GAAG,EAAE;EACP,CAAC;EACDb,IAAI,EAAE;IACJc,QAAQ,EAAE;EACZ,CAAC;EACDT,OAAO,EAAE;IACPU,IAAI,EAAE;EACR,CAAC;EACDjB,KAAK,EAAE;IACLkB,UAAU,EAAE,KAAK;IACjBF,QAAQ,EAAE,EAAE;IACZG,KAAK,EAAE,SAAS;IAChBC,YAAY,EAAE;EAChB,CAAC;EACDnB,IAAI,EAAE;IACJe,QAAQ,EAAE,EAAE;IACZG,KAAK,EAAE,MAAM;IACbE,UAAU,EAAE;EACd;AACF,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { View, Text, StyleSheet } from 'react-native';
|
|
4
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
|
+
/**
|
|
6
|
+
* Built-in card template that shows a product/service review summary.
|
|
7
|
+
* Injected by the AI agent to surface social proof at decision points.
|
|
8
|
+
*
|
|
9
|
+
* IMPORTANT: displayName is set explicitly to survive minification.
|
|
10
|
+
* The injectCardTool resolves templates by `T.displayName`, not `T.name`.
|
|
11
|
+
*/
|
|
12
|
+
export function ReviewSummary({
|
|
13
|
+
rating = 0,
|
|
14
|
+
reviewCount = 0,
|
|
15
|
+
headline = 'Customer Reviews',
|
|
16
|
+
sentiment = 'neutral'
|
|
17
|
+
}) {
|
|
18
|
+
const stars = Math.round(Math.min(5, Math.max(0, rating)));
|
|
19
|
+
const filled = '★'.repeat(stars);
|
|
20
|
+
const empty = '☆'.repeat(5 - stars);
|
|
21
|
+
const sentimentColor = {
|
|
22
|
+
positive: '#16a34a',
|
|
23
|
+
neutral: '#6b7280',
|
|
24
|
+
negative: '#dc2626'
|
|
25
|
+
};
|
|
26
|
+
return /*#__PURE__*/_jsxs(View, {
|
|
27
|
+
style: styles.container,
|
|
28
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
29
|
+
style: styles.headline,
|
|
30
|
+
children: headline
|
|
31
|
+
}), /*#__PURE__*/_jsxs(View, {
|
|
32
|
+
style: styles.row,
|
|
33
|
+
children: [/*#__PURE__*/_jsxs(Text, {
|
|
34
|
+
style: [styles.stars, {
|
|
35
|
+
color: sentimentColor[sentiment]
|
|
36
|
+
}],
|
|
37
|
+
children: [filled, empty]
|
|
38
|
+
}), /*#__PURE__*/_jsxs(Text, {
|
|
39
|
+
style: styles.meta,
|
|
40
|
+
children: [rating.toFixed(1), " \xB7 ", reviewCount.toLocaleString(), " reviews"]
|
|
41
|
+
})]
|
|
42
|
+
})]
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Explicit — function.name is mangled in minified production builds.
|
|
47
|
+
ReviewSummary.displayName = 'ReviewSummary';
|
|
48
|
+
const styles = StyleSheet.create({
|
|
49
|
+
container: {
|
|
50
|
+
backgroundColor: '#fffbeb',
|
|
51
|
+
borderRadius: 10,
|
|
52
|
+
padding: 12
|
|
53
|
+
},
|
|
54
|
+
headline: {
|
|
55
|
+
fontWeight: '600',
|
|
56
|
+
fontSize: 13,
|
|
57
|
+
color: '#1a1a2e',
|
|
58
|
+
marginBottom: 6
|
|
59
|
+
},
|
|
60
|
+
row: {
|
|
61
|
+
flexDirection: 'row',
|
|
62
|
+
alignItems: 'center',
|
|
63
|
+
gap: 8
|
|
64
|
+
},
|
|
65
|
+
stars: {
|
|
66
|
+
fontSize: 18,
|
|
67
|
+
letterSpacing: 1
|
|
68
|
+
},
|
|
69
|
+
meta: {
|
|
70
|
+
fontSize: 12,
|
|
71
|
+
color: '#6b7280'
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
//# sourceMappingURL=ReviewSummary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["View","Text","StyleSheet","jsx","_jsx","jsxs","_jsxs","ReviewSummary","rating","reviewCount","headline","sentiment","stars","Math","round","min","max","filled","repeat","empty","sentimentColor","positive","neutral","negative","style","styles","container","children","row","color","meta","toFixed","toLocaleString","displayName","create","backgroundColor","borderRadius","padding","fontWeight","fontSize","marginBottom","flexDirection","alignItems","gap","letterSpacing"],"sourceRoot":"../../../../src","sources":["components/cards/ReviewSummary.tsx"],"mappings":";;AAAA,SAASA,IAAI,EAAEC,IAAI,EAAEC,UAAU,QAAQ,cAAc;AAAC,SAAAC,GAAA,IAAAC,IAAA,EAAAC,IAAA,IAAAC,KAAA;AAStD;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,aAAaA,CAAC;EAC5BC,MAAM,GAAG,CAAC;EACVC,WAAW,GAAG,CAAC;EACfC,QAAQ,GAAG,kBAAkB;EAC7BC,SAAS,GAAG;AACM,CAAC,EAAE;EACrB,MAAMC,KAAK,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,GAAG,CAAC,CAAC,EAAEF,IAAI,CAACG,GAAG,CAAC,CAAC,EAAER,MAAM,CAAC,CAAC,CAAC;EAC1D,MAAMS,MAAM,GAAG,GAAG,CAACC,MAAM,CAACN,KAAK,CAAC;EAChC,MAAMO,KAAK,GAAG,GAAG,CAACD,MAAM,CAAC,CAAC,GAAGN,KAAK,CAAC;EAEnC,MAAMQ,cAAwE,GAAG;IAC/EC,QAAQ,EAAE,SAAS;IACnBC,OAAO,EAAE,SAAS;IAClBC,QAAQ,EAAE;EACZ,CAAC;EAED,oBACEjB,KAAA,CAACN,IAAI;IAACwB,KAAK,EAAEC,MAAM,CAACC,SAAU;IAAAC,QAAA,gBAC5BvB,IAAA,CAACH,IAAI;MAACuB,KAAK,EAAEC,MAAM,CAACf,QAAS;MAAAiB,QAAA,EAAEjB;IAAQ,CAAO,CAAC,eAC/CJ,KAAA,CAACN,IAAI;MAACwB,KAAK,EAAEC,MAAM,CAACG,GAAI;MAAAD,QAAA,gBACtBrB,KAAA,CAACL,IAAI;QAACuB,KAAK,EAAE,CAACC,MAAM,CAACb,KAAK,EAAE;UAAEiB,KAAK,EAAET,cAAc,CAACT,SAAS;QAAE,CAAC,CAAE;QAAAgB,QAAA,GAC/DV,MAAM,EAAEE,KAAK;MAAA,CACV,CAAC,eACPb,KAAA,CAACL,IAAI;QAACuB,KAAK,EAAEC,MAAM,CAACK,IAAK;QAAAH,QAAA,GACtBnB,MAAM,CAACuB,OAAO,CAAC,CAAC,CAAC,EAAC,QAAG,EAACtB,WAAW,CAACuB,cAAc,CAAC,CAAC,EAAC,UACtD;MAAA,CAAM,CAAC;IAAA,CACH,CAAC;EAAA,CACH,CAAC;AAEX;;AAEA;AACAzB,aAAa,CAAC0B,WAAW,GAAG,eAAe;AAE3C,MAAMR,MAAM,GAAGvB,UAAU,CAACgC,MAAM,CAAC;EAC/BR,SAAS,EAAE;IACTS,eAAe,EAAE,SAAS;IAC1BC,YAAY,EAAE,EAAE;IAChBC,OAAO,EAAE;EACX,CAAC;EACD3B,QAAQ,EAAE;IACR4B,UAAU,EAAE,KAAK;IACjBC,QAAQ,EAAE,EAAE;IACZV,KAAK,EAAE,SAAS;IAChBW,YAAY,EAAE;EAChB,CAAC;EACDZ,GAAG,EAAE;IACHa,aAAa,EAAE,KAAK;IACpBC,UAAU,EAAE,QAAQ;IACpBC,GAAG,EAAE;EACP,CAAC;EACD/B,KAAK,EAAE;IACL2B,QAAQ,EAAE,EAAE;IACZK,aAAa,EAAE;EACjB,CAAC;EACDd,IAAI,EAAE;IACJS,QAAQ,EAAE,EAAE;IACZV,KAAK,EAAE;EACT;AACF,CAAC,CAAC","ignoreList":[]}
|