Files
flutter/lib/models/place_models.dart
Ruslan Bakiev 277888c407
All checks were successful
Build and deploy Flutter Web / build (push) Successful in 3m17s
Use ontology traits in map UI
2026-05-08 16:22:36 +07:00

101 lines
2.6 KiB
Dart

import 'package:flutter/material.dart';
import 'package:latlong2/latlong.dart';
enum PlaceTrait {
calm,
dynamic,
intimate,
open,
solo,
group,
reset,
impress,
transit,
clean,
expressive,
}
extension PlaceTraitText on PlaceTrait {
String get label {
return switch (this) {
PlaceTrait.calm => 'спокойное',
PlaceTrait.dynamic => 'живое',
PlaceTrait.intimate => 'камерное',
PlaceTrait.open => 'открытое',
PlaceTrait.solo => 'для себя',
PlaceTrait.group => 'для компании',
PlaceTrait.reset => 'выдохнуть',
PlaceTrait.impress => 'впечатлить',
PlaceTrait.transit => 'транзитное',
PlaceTrait.clean => 'чистое',
PlaceTrait.expressive => 'выразительное',
};
}
IconData get icon {
return switch (this) {
PlaceTrait.calm => Icons.air_outlined,
PlaceTrait.dynamic => Icons.bolt_outlined,
PlaceTrait.intimate => Icons.lock_outline,
PlaceTrait.open => Icons.public_outlined,
PlaceTrait.solo => Icons.person_outline,
PlaceTrait.group => Icons.forum_outlined,
PlaceTrait.reset => Icons.spa_outlined,
PlaceTrait.impress => Icons.diamond_outlined,
PlaceTrait.transit => Icons.near_me_outlined,
PlaceTrait.clean => Icons.wb_sunny_outlined,
PlaceTrait.expressive => Icons.auto_awesome_outlined,
};
}
}
class PlaceRecommendation {
const PlaceRecommendation({
required this.id,
required this.name,
required this.area,
required this.photoUrls,
required this.coordinate,
required this.traits,
});
final String id;
final String name;
final String area;
final List<String> photoUrls;
final LatLng coordinate;
final Set<PlaceTrait> traits;
String get coverPhotoUrl => photoUrls.first;
}
class VoiceReviewDraft {
const VoiceReviewDraft({
required this.placeName,
required this.duration,
required this.extractedTraits,
required this.evidence,
});
final String placeName;
final Duration duration;
final Set<PlaceTrait> extractedTraits;
final List<String> evidence;
bool get isLongEnough => duration.inSeconds >= 30;
VoiceReviewDraft copyWith({
String? placeName,
Duration? duration,
Set<PlaceTrait>? extractedTraits,
List<String>? evidence,
}) {
return VoiceReviewDraft(
placeName: placeName ?? this.placeName,
duration: duration ?? this.duration,
extractedTraits: extractedTraits ?? this.extractedTraits,
evidence: evidence ?? this.evidence,
);
}
}