@@ -2,9 +2,12 @@ import SwiftUI
22import SwiftData
33import Charts
44
5+ private struct ShareTarget : Identifiable { let id = UUID ( ) ; let card : ResultCard }
6+
57struct LogView : View {
68 @Environment ( \. modelContext) private var ctx
79 @Query ( sort: \LogEntry . date, order: . reverse) private var entries : [ LogEntry ]
10+ @State private var shareTarget : ShareTarget ?
811
912 var body : some View {
1013 NavigationStack {
@@ -48,6 +51,7 @@ struct LogView: View {
4851 }
4952 . listStyle ( . plain)
5053 . scrollContentBackground ( . hidden)
54+ . sheet ( item: $shareTarget) { t in ShareResultView ( card: t. card) . presentationDragIndicator ( . visible) }
5155 }
5256
5357 // MARK: stats
@@ -79,24 +83,33 @@ struct LogView: View {
7983 }
8084
8185 private func row( _ e: LogEntry ) -> some View {
82- HStack ( spacing: 12 ) {
83- Circle ( ) . fill ( Theme . levelColor ( e. level) ) . frame ( width: 8 , height: 8 )
84- VStack ( alignment: . leading, spacing: 2 ) {
85- HStack ( spacing: 6 ) {
86- Text ( e. name) . font ( . body( 15 , . semibold) ) . foregroundStyle ( Theme . text)
87- if prIDs. contains ( e. persistentModelID) {
88- Text ( " PR " ) . font ( . system( size: 9 , weight: . black) ) . foregroundStyle ( . black)
89- . padding ( . horizontal, 5 ) . padding ( . vertical, 2 ) . background ( Theme . primary, in: Capsule ( ) )
86+ Button {
87+ Haptics . tap ( )
88+ shareTarget = ShareTarget ( card: ResultCard (
89+ name: e. name, result: e. result,
90+ subtitle: " \( e. type) · \( levelShort [ max ( 1 , min ( 7 , e. level) ) - 1 ] ) " , levelNumber: e. level) )
91+ } label: {
92+ HStack ( spacing: 12 ) {
93+ Circle ( ) . fill ( Theme . levelColor ( e. level) ) . frame ( width: 8 , height: 8 )
94+ VStack ( alignment: . leading, spacing: 2 ) {
95+ HStack ( spacing: 6 ) {
96+ Text ( e. name) . font ( . body( 15 , . semibold) ) . foregroundStyle ( Theme . text)
97+ if prIDs. contains ( e. persistentModelID) {
98+ Text ( " PR " ) . font ( . system( size: 9 , weight: . black) ) . foregroundStyle ( . black)
99+ . padding ( . horizontal, 5 ) . padding ( . vertical, 2 ) . background ( Theme . primary, in: Capsule ( ) )
100+ }
90101 }
102+ Text ( " \( e. type) · \( prettyDate ( e. date) ) \( e. notes. map { " · \( $0) " } ?? " " ) " )
103+ . font ( . body( 12 ) ) . foregroundStyle ( Theme . textFaint) . lineLimit ( 1 )
91104 }
92- Text ( " \( e. type) · \( prettyDate ( e. date) ) \( e. notes. map { " · \( $0) " } ?? " " ) " )
93- . font ( . body( 12 ) ) . foregroundStyle ( Theme . textFaint) . lineLimit ( 1 )
105+ Spacer ( )
106+ Text ( e. result) . font ( . display( 16 , . bold) ) . foregroundStyle ( Theme . primary)
107+ Image ( systemName: " square.and.arrow.up " ) . font ( . system( size: 12 , weight: . semibold) ) . foregroundStyle ( Theme . textFaint)
94108 }
95- Spacer ( )
96- Text ( e. result) . font ( . display( 16 , . bold) ) . foregroundStyle ( Theme . primary)
97- }
98- . padding ( . vertical, 11 )
99- . overlay ( alignment: . bottom) { Rectangle ( ) . fill ( Theme . stroke) . frame ( height: 1 ) }
109+ . padding ( . vertical, 11 )
110+ . contentShape ( Rectangle ( ) )
111+ . overlay ( alignment: . bottom) { Rectangle ( ) . fill ( Theme . stroke) . frame ( height: 1 ) }
112+ } . buttonStyle ( . plain)
100113 }
101114
102115 // MARK: derived
0 commit comments