Files
InvestmentTrackerApp/PortfolioJournal/Services/AppTips.swift
T
alexandrev-tibco 4c0d2af564 Calm 2.0 Fase 4: TipKit para descubrimiento + aha post-onboarding (build 55)
TipKit (Tips.configure con frecuencia diaria):
- QuickUpdateTip: popover en el '+' del Home — descubre Quick Update
- ScreenshotOCRTip: inline en Quick Update — descubre el OCR por captura
- SiriTip: en el cierre del check-in guiado — descubre el intent de voz
- ChartShareTip: popover en el compartir de Charts
- Se invalidan al ejecutar la acción; máx 1-2 impresiones cada uno
- Strings ×7 idiomas

Onboarding:
- Al completar el onboarding sin datos, se abre Add Source directamente
  (notificación .openAddFirstSource) — el usuario nuevo no aterriza en un
  dashboard vacío

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WoScpmHdVj1aUf4rAp6hbe
2026-07-10 09:31:03 +02:00

38 lines
1.5 KiB
Swift

import SwiftUI
import TipKit
// MARK: - Feature discovery (TipKit, Calm 2.0 Fase 4)
//
// The app's most differentiating features (quick update, screenshot OCR, Siri,
// chart sharing) were invisible unless you stumbled on them. One contextual tip
// each, shown at most once a day (see Tips.configure in PortfolioJournalApp),
// auto-invalidated after display or when the action is performed.
struct QuickUpdateTip: Tip {
var title: Text { Text(String(localized: "tip_quick_update_title")) }
var message: Text? { Text(String(localized: "tip_quick_update_body")) }
var image: Image? { Image(systemName: "bolt.circle.fill") }
var options: [any TipOption] { [MaxDisplayCount(2)] }
}
struct ScreenshotOCRTip: Tip {
var title: Text { Text(String(localized: "tip_ocr_title")) }
var message: Text? { Text(String(localized: "tip_ocr_body")) }
var image: Image? { Image(systemName: "text.viewfinder") }
var options: [any TipOption] { [MaxDisplayCount(2)] }
}
struct SiriTip: Tip {
var title: Text { Text(String(localized: "tip_siri_title")) }
var message: Text? { Text(String(localized: "tip_siri_body")) }
var image: Image? { Image(systemName: "mic.fill") }
var options: [any TipOption] { [MaxDisplayCount(1)] }
}
struct ChartShareTip: Tip {
var title: Text { Text(String(localized: "tip_chart_share_title")) }
var message: Text? { Text(String(localized: "tip_chart_share_body")) }
var image: Image? { Image(systemName: "square.and.arrow.up") }
var options: [any TipOption] { [MaxDisplayCount(2)] }
}