ponshu-room-lite/lib/models/user_profile.dart

158 lines
4.9 KiB
Dart
Raw Normal View History

import 'package:hive/hive.dart';
import '../services/level_calculator.dart';
part 'user_profile.g.dart';
@HiveType(typeId: 1)
class UserProfile extends HiveObject {
@HiveField(0)
// DEPRECATED: String? mbtiType;
// Hive indices must not be reused or reordered carelessly.
// Ideally we keep the index but ignore it, or just use the old index for new logic.
// The user review suggested: "Remove old fields... or unify".
// Since we already used new indices (6, 7) in the previous step and ran build_runner,
// keeping 6 and 7 is safer if we want to avoid migration issues with recently created data.
// But since this is dev, clean up is better.
// However, I will follow the user's advice to remove the old ones.
// I will comment them out to reserve the index if needed, or just remove.
// Let's remove them and their constructor args.
@HiveField(2)
String fontPreference; // "serif" or "sans"
@HiveField(3)
DateTime createdAt;
@HiveField(4)
DateTime? updatedAt;
@HiveField(5)
String displayMode; // "list" or "grid"
@HiveField(6)
String? mbti; // 本物のMBTIユーザー入力
@HiveField(21) // Appended new field
String? sakePersonaMbti; // AI診断による酒向タイプ
@HiveField(7)
DateTime? birthdate;
@HiveField(8)
String themeMode; // 'system', 'light', 'dark'
@HiveField(9, defaultValue: false)
bool isBusinessMode;
@HiveField(10, defaultValue: 3.0)
double defaultMarkup;
@HiveField(11, defaultValue: false)
bool hasCompletedOnboarding;
@HiveField(12)
String? nickname;
@HiveField(13)
String? gender; // 'male', 'female', 'other', null
@HiveField(14, defaultValue: 0)
int totalExp;
@HiveField(15, defaultValue: [])
List<String> unlockedBadges;
// DEPRECATED: Tutorial flags no longer used (simplified to guide screen only)
@HiveField(16, defaultValue: false)
@Deprecated('Tutorial system removed in favor of guide screen')
bool hasSeenCameraTutorial;
@HiveField(17, defaultValue: false)
@Deprecated('Tutorial system removed in favor of guide screen')
bool hasSeenProfileTutorial;
@HiveField(18, defaultValue: false)
@Deprecated('Tutorial system removed in favor of guide screen')
bool hasSeenSommelierTutorial;
@HiveField(19, defaultValue: 'ja')
String locale; // 'ja', 'en', 'fr', 'de'
@HiveField(20, defaultValue: 'washi_sumi_kohaku')
String colorVariant; // 'washi_sumi_kohaku' (Theme A), 'current' (Theme B)
// Calculators
int get level => LevelCalculator.getLevel(totalExp);
String get title => LevelCalculator.getTitle(totalExp);
double get nextLevelProgress => LevelCalculator.getProgress(totalExp);
int get expToNextLevel => LevelCalculator.getExpToNextLevel(totalExp);
UserProfile({
this.fontPreference = 'sans',
this.displayMode = 'list',
required this.createdAt,
this.updatedAt,
this.mbti,
this.sakePersonaMbti,
this.birthdate,
this.themeMode = 'system',
this.isBusinessMode = false,
this.defaultMarkup = 3.0,
this.hasCompletedOnboarding = false,
this.nickname,
this.gender,
this.totalExp = 0,
this.unlockedBadges = const [],
this.hasSeenCameraTutorial = false,
this.hasSeenProfileTutorial = false,
this.hasSeenSommelierTutorial = false,
this.locale = 'ja',
this.colorVariant = 'washi_sumi_kohaku',
});
UserProfile copyWith({
String? fontPreference,
String? displayMode,
DateTime? createdAt,
DateTime? updatedAt,
String? mbti,
String? sakePersonaMbti,
DateTime? birthdate,
String? themeMode,
bool? isBusinessMode,
double? defaultMarkup,
bool? hasCompletedOnboarding,
String? nickname,
String? gender,
int? totalExp,
List<String>? unlockedBadges,
// REMOVED: Tutorial parameters (system removed in favor of guide screen)
String? locale,
String? colorVariant,
}) {
return UserProfile(
fontPreference: fontPreference ?? this.fontPreference,
displayMode: displayMode ?? this.displayMode,
createdAt: createdAt ?? this.createdAt,
updatedAt: updatedAt ?? this.updatedAt,
mbti: mbti ?? this.mbti,
sakePersonaMbti: sakePersonaMbti ?? this.sakePersonaMbti,
birthdate: birthdate ?? this.birthdate,
themeMode: themeMode ?? this.themeMode,
isBusinessMode: isBusinessMode ?? this.isBusinessMode,
defaultMarkup: defaultMarkup ?? this.defaultMarkup,
hasCompletedOnboarding: hasCompletedOnboarding ?? this.hasCompletedOnboarding,
nickname: nickname ?? this.nickname,
gender: gender ?? this.gender,
totalExp: totalExp ?? this.totalExp,
unlockedBadges: unlockedBadges ?? this.unlockedBadges,
// Tutorial fields preserved in constructor for Hive compatibility
hasSeenCameraTutorial: this.hasSeenCameraTutorial,
hasSeenProfileTutorial: this.hasSeenProfileTutorial,
hasSeenSommelierTutorial: this.hasSeenSommelierTutorial,
locale: locale ?? this.locale,
colorVariant: colorVariant ?? this.colorVariant,
);
}
}