All checks were successful
Build and deploy Flutter Web / build (push) Successful in 3m17s
101 lines
2.6 KiB
Dart
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,
|
|
);
|
|
}
|
|
}
|