Implement multi-screen app UI flow and navigation
This commit is contained in:
@@ -0,0 +1,65 @@
|
||||
class PersonProfile {
|
||||
const PersonProfile({
|
||||
required this.id,
|
||||
required this.name,
|
||||
required this.relationship,
|
||||
required this.affinityScore,
|
||||
required this.nextMoment,
|
||||
required this.tags,
|
||||
required this.notes,
|
||||
});
|
||||
|
||||
final String id;
|
||||
final String name;
|
||||
final String relationship;
|
||||
final int affinityScore;
|
||||
final DateTime nextMoment;
|
||||
final List<String> tags;
|
||||
final String notes;
|
||||
}
|
||||
|
||||
class RelationshipMoment {
|
||||
const RelationshipMoment({
|
||||
required this.id,
|
||||
required this.personId,
|
||||
required this.title,
|
||||
required this.summary,
|
||||
required this.at,
|
||||
required this.type,
|
||||
});
|
||||
|
||||
final String id;
|
||||
final String personId;
|
||||
final String title;
|
||||
final String summary;
|
||||
final DateTime at;
|
||||
final String type;
|
||||
}
|
||||
|
||||
class DashboardTask {
|
||||
const DashboardTask({
|
||||
required this.title,
|
||||
required this.description,
|
||||
required this.when,
|
||||
this.done = false,
|
||||
});
|
||||
|
||||
final String title;
|
||||
final String description;
|
||||
final DateTime when;
|
||||
final bool done;
|
||||
}
|
||||
|
||||
class DashboardSummary {
|
||||
const DashboardSummary({
|
||||
required this.activePeople,
|
||||
required this.upcomingPlans,
|
||||
required this.pendingIdeas,
|
||||
required this.weeklyConsistency,
|
||||
});
|
||||
|
||||
final int activePeople;
|
||||
final int upcomingPlans;
|
||||
final int pendingIdeas;
|
||||
final int weeklyConsistency;
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:relationship_saver/features/local/local_models.dart';
|
||||
|
||||
class LocalRepository {
|
||||
const LocalRepository();
|
||||
|
||||
List<PersonProfile> people() {
|
||||
return <PersonProfile>[
|
||||
PersonProfile(
|
||||
id: 'p-ava',
|
||||
name: 'Ava Hart',
|
||||
relationship: 'Partner',
|
||||
affinityScore: 92,
|
||||
nextMoment: DateTime(2026, 2, 16, 19, 30),
|
||||
tags: <String>['coffee', 'books', 'slow mornings'],
|
||||
notes: 'Prefers thoughtful plans over expensive plans.',
|
||||
),
|
||||
PersonProfile(
|
||||
id: 'p-jordan',
|
||||
name: 'Jordan Lee',
|
||||
relationship: 'Close Friend',
|
||||
affinityScore: 78,
|
||||
nextMoment: DateTime(2026, 2, 18, 18, 0),
|
||||
tags: <String>['running', 'street food'],
|
||||
notes: 'Has a race on Sunday; ask how training is going.',
|
||||
),
|
||||
PersonProfile(
|
||||
id: 'p-mila',
|
||||
name: 'Mila Stone',
|
||||
relationship: 'Sister',
|
||||
affinityScore: 84,
|
||||
nextMoment: DateTime(2026, 2, 20, 12, 0),
|
||||
tags: <String>['plants', 'retro music'],
|
||||
notes: 'Birthday prep should start this week.',
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
List<RelationshipMoment> moments() {
|
||||
return <RelationshipMoment>[
|
||||
RelationshipMoment(
|
||||
id: 'm-1',
|
||||
personId: 'p-ava',
|
||||
title: 'Sunday Walk Tradition',
|
||||
summary: 'Short walk + no-phone hour worked really well.',
|
||||
at: DateTime(2026, 2, 9, 9, 30),
|
||||
type: 'ritual',
|
||||
),
|
||||
RelationshipMoment(
|
||||
id: 'm-2',
|
||||
personId: 'p-jordan',
|
||||
title: 'Post-workout Check-in',
|
||||
summary: 'Shared training playlist and grabbed smoothies.',
|
||||
at: DateTime(2026, 2, 11, 19, 0),
|
||||
type: 'support',
|
||||
),
|
||||
RelationshipMoment(
|
||||
id: 'm-3',
|
||||
personId: 'p-mila',
|
||||
title: 'Gift Idea Captured',
|
||||
summary: 'Found a vintage lamp from her saved style board.',
|
||||
at: DateTime(2026, 2, 12, 14, 20),
|
||||
type: 'gift',
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
List<DashboardTask> tasks() {
|
||||
return <DashboardTask>[
|
||||
DashboardTask(
|
||||
title: 'Plan Friday dinner with Ava',
|
||||
description: 'Keep it low-key: ramen + bookstore stop.',
|
||||
when: DateTime(2026, 2, 16, 17, 0),
|
||||
),
|
||||
DashboardTask(
|
||||
title: 'Send race-day encouragement to Jordan',
|
||||
description: 'Voice note before 8:00 AM.',
|
||||
when: DateTime(2026, 2, 17, 7, 30),
|
||||
),
|
||||
DashboardTask(
|
||||
title: 'Finalize Mila birthday shortlist',
|
||||
description: 'Pick 1 meaningful gift and 1 backup.',
|
||||
when: DateTime(2026, 2, 18, 20, 0),
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
DashboardSummary summary() {
|
||||
return DashboardSummary(
|
||||
activePeople: people().length,
|
||||
upcomingPlans: people()
|
||||
.where(
|
||||
(PersonProfile p) => p.nextMoment.isAfter(DateTime(2026, 2, 14)),
|
||||
)
|
||||
.length,
|
||||
pendingIdeas: 6,
|
||||
weeklyConsistency: 82,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
final Provider<LocalRepository> localRepositoryProvider =
|
||||
Provider<LocalRepository>((Ref ref) {
|
||||
return const LocalRepository();
|
||||
});
|
||||
Reference in New Issue
Block a user