Replace chat search with voice filter recommendations
Build and deploy Flutter Web / build (push) Successful in 3m11s

This commit is contained in:
Ruslan Bakiev
2026-06-12 22:43:05 +07:00
parent 318126d83a
commit ba85f31cef
22 changed files with 1360 additions and 884 deletions
@@ -20,8 +20,8 @@ class PlaceState {
required this.hasTelegramAuth, required this.hasTelegramAuth,
required this.userCoordinate, required this.userCoordinate,
required this.reviewDraft, required this.reviewDraft,
required this.searchQuery, required this.voiceFilterTranscript,
required this.searchMessage, required this.voiceFilterTags,
}); });
static final _distance = Distance(); static final _distance = Distance();
@@ -33,8 +33,8 @@ class PlaceState {
final bool hasTelegramAuth; final bool hasTelegramAuth;
final LatLng? userCoordinate; final LatLng? userCoordinate;
final VoiceReviewDraft reviewDraft; final VoiceReviewDraft reviewDraft;
final String searchQuery; final String voiceFilterTranscript;
final String searchMessage; final List<String> voiceFilterTags;
List<PlaceRecommendation> get recommendations { List<PlaceRecommendation> get recommendations {
final selected = selectedTrait; final selected = selectedTrait;
@@ -74,8 +74,8 @@ class PlaceState {
bool? hasTelegramAuth, bool? hasTelegramAuth,
Object? userCoordinate = _unset, Object? userCoordinate = _unset,
VoiceReviewDraft? reviewDraft, VoiceReviewDraft? reviewDraft,
String? searchQuery, String? voiceFilterTranscript,
String? searchMessage, List<String>? voiceFilterTags,
}) { }) {
return PlaceState( return PlaceState(
selectedTrait: identical(selectedTrait, _unset) selectedTrait: identical(selectedTrait, _unset)
@@ -93,8 +93,9 @@ class PlaceState {
? this.userCoordinate ? this.userCoordinate
: userCoordinate as LatLng?, : userCoordinate as LatLng?,
reviewDraft: reviewDraft ?? this.reviewDraft, reviewDraft: reviewDraft ?? this.reviewDraft,
searchQuery: searchQuery ?? this.searchQuery, voiceFilterTranscript:
searchMessage: searchMessage ?? this.searchMessage, voiceFilterTranscript ?? this.voiceFilterTranscript,
voiceFilterTags: voiceFilterTags ?? this.voiceFilterTags,
); );
} }
} }
@@ -164,8 +165,8 @@ class PlaceCubit extends Cubit<PlaceViewState> {
hasTelegramAuth: _authRepository.hasTelegramAuth, hasTelegramAuth: _authRepository.hasTelegramAuth,
userCoordinate: userCoordinate, userCoordinate: userCoordinate,
reviewDraft: _emptyDraft, reviewDraft: _emptyDraft,
searchQuery: '', voiceFilterTranscript: '',
searchMessage: '', voiceFilterTags: const [],
), ),
), ),
); );
@@ -182,7 +183,12 @@ class PlaceCubit extends Cubit<PlaceViewState> {
} }
emit( emit(
PlaceViewState.ready( PlaceViewState.ready(
value.copyWith(selectedTrait: trait, selectedPlaceId: next?.id), value.copyWith(
selectedTrait: trait,
selectedPlaceId: next?.id,
voiceFilterTranscript: '',
voiceFilterTags: const [],
),
), ),
); );
} }
@@ -202,15 +208,15 @@ class PlaceCubit extends Cubit<PlaceViewState> {
emit(PlaceViewState.ready(value.copyWith(selectedPlaceId: placeId))); emit(PlaceViewState.ready(value.copyWith(selectedPlaceId: placeId)));
} }
Future<void> searchPlaces(String query) async { Future<void> recommendPlacesByVoice({
required String audioContentBase64,
required String audioMimeType,
}) async {
final value = _requireReady(); final value = _requireReady();
final normalizedQuery = query.trim(); final result = await _placesRepository.recommendPlacesByVoice(
if (normalizedQuery.isEmpty) { audioContentBase64: audioContentBase64,
await clearSearch(); audioMimeType: audioMimeType,
return; );
}
final result = await _placesRepository.searchPlaces(normalizedQuery);
emit( emit(
PlaceViewState.ready( PlaceViewState.ready(
value.copyWith( value.copyWith(
@@ -219,14 +225,14 @@ class PlaceCubit extends Cubit<PlaceViewState> {
? null ? null
: result.places.first.id, : result.places.first.id,
selectedTrait: null, selectedTrait: null,
searchQuery: normalizedQuery, voiceFilterTranscript: result.transcript,
searchMessage: result.message, voiceFilterTags: result.tags,
), ),
), ),
); );
} }
Future<void> clearSearch() async { Future<void> clearVoiceFilter() async {
final value = _requireReady(); final value = _requireReady();
final places = await _placesRepository.fetchPlaces(); final places = await _placesRepository.fetchPlaces();
emit( emit(
@@ -235,8 +241,8 @@ class PlaceCubit extends Cubit<PlaceViewState> {
places: places, places: places,
selectedPlaceId: places.isEmpty ? null : places.first.id, selectedPlaceId: places.isEmpty ? null : places.first.id,
selectedTrait: null, selectedTrait: null,
searchQuery: '', voiceFilterTranscript: '',
searchMessage: '', voiceFilterTags: const [],
), ),
), ),
); );
@@ -310,8 +316,8 @@ class PlaceCubit extends Cubit<PlaceViewState> {
places: places, places: places,
selectedPlaceId: selectedPlace, selectedPlaceId: selectedPlace,
reviewDraft: _emptyDraft, reviewDraft: _emptyDraft,
searchQuery: '', voiceFilterTranscript: '',
searchMessage: '', voiceFilterTags: const [],
), ),
), ),
); );
@@ -342,8 +348,8 @@ class PlaceCubit extends Cubit<PlaceViewState> {
hasTelegramAuth: hasTelegramAuth, hasTelegramAuth: hasTelegramAuth,
userCoordinate: null, userCoordinate: null,
reviewDraft: _emptyDraft, reviewDraft: _emptyDraft,
searchQuery: '', voiceFilterTranscript: '',
searchMessage: '', voiceFilterTags: const [],
); );
} }
} }
@@ -4,14 +4,14 @@
// ignore_for_file: no_leading_underscores_for_library_prefixes // ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:gql/ast.dart' as _i1; import 'package:gql/ast.dart' as _i1;
const SearchPlaces = _i1.OperationDefinitionNode( const RecommendPlacesByVoice = _i1.OperationDefinitionNode(
type: _i1.OperationType.query, type: _i1.OperationType.mutation,
name: _i1.NameNode(value: 'SearchPlaces'), name: _i1.NameNode(value: 'RecommendPlacesByVoice'),
variableDefinitions: [ variableDefinitions: [
_i1.VariableDefinitionNode( _i1.VariableDefinitionNode(
variable: _i1.VariableNode(name: _i1.NameNode(value: 'input')), variable: _i1.VariableNode(name: _i1.NameNode(value: 'input')),
type: _i1.NamedTypeNode( type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'SearchPlacesInput'), name: _i1.NameNode(value: 'VoicePlaceRecommendationsInput'),
isNonNull: true, isNonNull: true,
), ),
defaultValue: _i1.DefaultValueNode(value: null), defaultValue: _i1.DefaultValueNode(value: null),
@@ -22,7 +22,7 @@ const SearchPlaces = _i1.OperationDefinitionNode(
selectionSet: _i1.SelectionSetNode( selectionSet: _i1.SelectionSetNode(
selections: [ selections: [
_i1.FieldNode( _i1.FieldNode(
name: _i1.NameNode(value: 'searchPlaces'), name: _i1.NameNode(value: 'recommendPlacesByVoice'),
alias: null, alias: null,
arguments: [ arguments: [
_i1.ArgumentNode( _i1.ArgumentNode(
@@ -34,7 +34,21 @@ const SearchPlaces = _i1.OperationDefinitionNode(
selectionSet: _i1.SelectionSetNode( selectionSet: _i1.SelectionSetNode(
selections: [ selections: [
_i1.FieldNode( _i1.FieldNode(
name: _i1.NameNode(value: 'message'), name: _i1.NameNode(value: 'transcript'),
alias: null,
arguments: [],
directives: [],
selectionSet: null,
),
_i1.FieldNode(
name: _i1.NameNode(value: 'tags'),
alias: null,
arguments: [],
directives: [],
selectionSet: null,
),
_i1.FieldNode(
name: _i1.NameNode(value: 'summary'),
alias: null, alias: null,
arguments: [], arguments: [],
directives: [], directives: [],
@@ -192,4 +206,4 @@ const SearchPlaces = _i1.OperationDefinitionNode(
], ],
), ),
); );
const document = _i1.DocumentNode(definitions: [SearchPlaces]); const document = _i1.DocumentNode(definitions: [RecommendPlacesByVoice]);
@@ -0,0 +1,195 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/json_object.dart' as _i2;
import 'package:built_value/serializer.dart';
import 'package:mapflow/features/mapflow/data/graphql/__generated__/schema.schema.gql.dart'
as _i3;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/serializers.gql.dart'
as _i1;
part 'recommend_places_by_voice.data.gql.g.dart';
abstract class GRecommendPlacesByVoiceData
implements
Built<GRecommendPlacesByVoiceData, GRecommendPlacesByVoiceDataBuilder> {
GRecommendPlacesByVoiceData._();
factory GRecommendPlacesByVoiceData([
void Function(GRecommendPlacesByVoiceDataBuilder b) updates,
]) = _$GRecommendPlacesByVoiceData;
static void _initializeBuilder(GRecommendPlacesByVoiceDataBuilder b) =>
b..G__typename = 'Mutation';
@BuiltValueField(wireName: '__typename')
String get G__typename;
GRecommendPlacesByVoiceData_recommendPlacesByVoice get recommendPlacesByVoice;
static Serializer<GRecommendPlacesByVoiceData> get serializer =>
_$gRecommendPlacesByVoiceDataSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(
GRecommendPlacesByVoiceData.serializer,
this,
)
as Map<String, dynamic>);
static GRecommendPlacesByVoiceData? fromJson(Map<String, dynamic> json) => _i1
.serializers
.deserializeWith(GRecommendPlacesByVoiceData.serializer, json);
}
abstract class GRecommendPlacesByVoiceData_recommendPlacesByVoice
implements
Built<
GRecommendPlacesByVoiceData_recommendPlacesByVoice,
GRecommendPlacesByVoiceData_recommendPlacesByVoiceBuilder
> {
GRecommendPlacesByVoiceData_recommendPlacesByVoice._();
factory GRecommendPlacesByVoiceData_recommendPlacesByVoice([
void Function(GRecommendPlacesByVoiceData_recommendPlacesByVoiceBuilder b)
updates,
]) = _$GRecommendPlacesByVoiceData_recommendPlacesByVoice;
static void _initializeBuilder(
GRecommendPlacesByVoiceData_recommendPlacesByVoiceBuilder b,
) => b..G__typename = 'VoicePlaceRecommendationsPayload';
@BuiltValueField(wireName: '__typename')
String get G__typename;
String get transcript;
BuiltList<String> get tags;
String get summary;
BuiltList<GRecommendPlacesByVoiceData_recommendPlacesByVoice_places>
get places;
static Serializer<GRecommendPlacesByVoiceData_recommendPlacesByVoice>
get serializer =>
_$gRecommendPlacesByVoiceDataRecommendPlacesByVoiceSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(
GRecommendPlacesByVoiceData_recommendPlacesByVoice.serializer,
this,
)
as Map<String, dynamic>);
static GRecommendPlacesByVoiceData_recommendPlacesByVoice? fromJson(
Map<String, dynamic> json,
) => _i1.serializers.deserializeWith(
GRecommendPlacesByVoiceData_recommendPlacesByVoice.serializer,
json,
);
}
abstract class GRecommendPlacesByVoiceData_recommendPlacesByVoice_places
implements
Built<
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places,
GRecommendPlacesByVoiceData_recommendPlacesByVoice_placesBuilder
> {
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places._();
factory GRecommendPlacesByVoiceData_recommendPlacesByVoice_places([
void Function(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_placesBuilder b,
)
updates,
]) = _$GRecommendPlacesByVoiceData_recommendPlacesByVoice_places;
static void _initializeBuilder(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_placesBuilder b,
) => b..G__typename = 'Place';
@BuiltValueField(wireName: '__typename')
String get G__typename;
String get id;
String get googlePlaceId;
String get name;
double get latitude;
double get longitude;
String? get googlePrimaryType;
BuiltList<String> get googleTypes;
String? get googleBusinessStatus;
double? get googleRating;
int? get googleUserRatingCount;
_i2.JsonObject? get googleRegularOpeningHours;
_i2.JsonObject? get googleCurrentOpeningHours;
BuiltList<String> get photoUrls;
BuiltList<String> get traits;
bool get isFavorite;
BuiltList<
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences
>
get experiences;
static Serializer<GRecommendPlacesByVoiceData_recommendPlacesByVoice_places>
get serializer =>
_$gRecommendPlacesByVoiceDataRecommendPlacesByVoicePlacesSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places
.serializer,
this,
)
as Map<String, dynamic>);
static GRecommendPlacesByVoiceData_recommendPlacesByVoice_places? fromJson(
Map<String, dynamic> json,
) => _i1.serializers.deserializeWith(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places.serializer,
json,
);
}
abstract class GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences
implements
Built<
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences,
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiencesBuilder
> {
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences._();
factory GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences([
void Function(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiencesBuilder
b,
)
updates,
]) = _$GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences;
static void _initializeBuilder(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiencesBuilder
b,
) => b..G__typename = 'VoiceExperience';
@BuiltValueField(wireName: '__typename')
String get G__typename;
String get id;
_i3.GVoiceExperienceStatus get status;
String get createdAt;
static Serializer<
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences
>
get serializer =>
_$gRecommendPlacesByVoiceDataRecommendPlacesByVoicePlacesExperiencesSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences
.serializer,
this,
)
as Map<String, dynamic>);
static GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences?
fromJson(Map<String, dynamic> json) => _i1.serializers.deserializeWith(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences
.serializer,
json,
);
}
@@ -6,35 +6,39 @@ import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart'; import 'package:built_value/serializer.dart';
import 'package:ferry_exec/ferry_exec.dart' as _i1; import 'package:ferry_exec/ferry_exec.dart' as _i1;
import 'package:gql_exec/gql_exec.dart' as _i4; import 'package:gql_exec/gql_exec.dart' as _i4;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/search_places.ast.gql.dart' import 'package:mapflow/features/mapflow/data/graphql/__generated__/recommend_places_by_voice.ast.gql.dart'
as _i5; as _i5;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/search_places.data.gql.dart' import 'package:mapflow/features/mapflow/data/graphql/__generated__/recommend_places_by_voice.data.gql.dart'
as _i2; as _i2;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/search_places.var.gql.dart' import 'package:mapflow/features/mapflow/data/graphql/__generated__/recommend_places_by_voice.var.gql.dart'
as _i3; as _i3;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/serializers.gql.dart' import 'package:mapflow/features/mapflow/data/graphql/__generated__/serializers.gql.dart'
as _i6; as _i6;
part 'search_places.req.gql.g.dart'; part 'recommend_places_by_voice.req.gql.g.dart';
abstract class GSearchPlacesReq abstract class GRecommendPlacesByVoiceReq
implements implements
Built<GSearchPlacesReq, GSearchPlacesReqBuilder>, Built<GRecommendPlacesByVoiceReq, GRecommendPlacesByVoiceReqBuilder>,
_i1.OperationRequest<_i2.GSearchPlacesData, _i3.GSearchPlacesVars> { _i1.OperationRequest<
GSearchPlacesReq._(); _i2.GRecommendPlacesByVoiceData,
_i3.GRecommendPlacesByVoiceVars
> {
GRecommendPlacesByVoiceReq._();
factory GSearchPlacesReq([void Function(GSearchPlacesReqBuilder b) updates]) = factory GRecommendPlacesByVoiceReq([
_$GSearchPlacesReq; void Function(GRecommendPlacesByVoiceReqBuilder b) updates,
]) = _$GRecommendPlacesByVoiceReq;
static void _initializeBuilder(GSearchPlacesReqBuilder b) => b static void _initializeBuilder(GRecommendPlacesByVoiceReqBuilder b) => b
..operation = _i4.Operation( ..operation = _i4.Operation(
document: _i5.document, document: _i5.document,
operationName: 'SearchPlaces', operationName: 'RecommendPlacesByVoice',
) )
..executeOnListen = true; ..executeOnListen = true;
@override @override
_i3.GSearchPlacesVars get vars; _i3.GRecommendPlacesByVoiceVars get vars;
@override @override
_i4.Operation get operation; _i4.Operation get operation;
@override @override
@@ -48,13 +52,13 @@ abstract class GSearchPlacesReq
String? get requestId; String? get requestId;
@override @override
@BuiltValueField(serialize: false) @BuiltValueField(serialize: false)
_i2.GSearchPlacesData? Function( _i2.GRecommendPlacesByVoiceData? Function(
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
)? )?
get updateResult; get updateResult;
@override @override
_i2.GSearchPlacesData? get optimisticResponse; _i2.GRecommendPlacesByVoiceData? get optimisticResponse;
@override @override
String? get updateCacheHandlerKey; String? get updateCacheHandlerKey;
@override @override
@@ -67,27 +71,35 @@ abstract class GSearchPlacesReq
@BuiltValueField(serialize: false) @BuiltValueField(serialize: false)
_i4.Context? get context; _i4.Context? get context;
@override @override
_i2.GSearchPlacesData? parseData(Map<String, dynamic> json) => _i2.GRecommendPlacesByVoiceData? parseData(Map<String, dynamic> json) =>
_i2.GSearchPlacesData.fromJson(json); _i2.GRecommendPlacesByVoiceData.fromJson(json);
@override @override
Map<String, dynamic> varsToJson() => vars.toJson(); Map<String, dynamic> varsToJson() => vars.toJson();
@override @override
Map<String, dynamic> dataToJson(_i2.GSearchPlacesData data) => data.toJson(); Map<String, dynamic> dataToJson(_i2.GRecommendPlacesByVoiceData data) =>
data.toJson();
@override @override
_i1.OperationRequest<_i2.GSearchPlacesData, _i3.GSearchPlacesVars> _i1.OperationRequest<
_i2.GRecommendPlacesByVoiceData,
_i3.GRecommendPlacesByVoiceVars
>
transformOperation(_i4.Operation Function(_i4.Operation) transform) => transformOperation(_i4.Operation Function(_i4.Operation) transform) =>
this.rebuild((b) => b..operation = transform(operation)); this.rebuild((b) => b..operation = transform(operation));
static Serializer<GSearchPlacesReq> get serializer => static Serializer<GRecommendPlacesByVoiceReq> get serializer =>
_$gSearchPlacesReqSerializer; _$gRecommendPlacesByVoiceReqSerializer;
Map<String, dynamic> toJson() => Map<String, dynamic> toJson() =>
(_i6.serializers.serializeWith(GSearchPlacesReq.serializer, this) (_i6.serializers.serializeWith(
GRecommendPlacesByVoiceReq.serializer,
this,
)
as Map<String, dynamic>); as Map<String, dynamic>);
static GSearchPlacesReq? fromJson(Map<String, dynamic> json) => static GRecommendPlacesByVoiceReq? fromJson(Map<String, dynamic> json) => _i6
_i6.serializers.deserializeWith(GSearchPlacesReq.serializer, json); .serializers
.deserializeWith(GRecommendPlacesByVoiceReq.serializer, json);
} }
@@ -1,32 +1,35 @@
// GENERATED CODE - DO NOT MODIFY BY HAND // GENERATED CODE - DO NOT MODIFY BY HAND
part of 'search_places.req.gql.dart'; part of 'recommend_places_by_voice.req.gql.dart';
// ************************************************************************** // **************************************************************************
// BuiltValueGenerator // BuiltValueGenerator
// ************************************************************************** // **************************************************************************
Serializer<GSearchPlacesReq> _$gSearchPlacesReqSerializer = Serializer<GRecommendPlacesByVoiceReq> _$gRecommendPlacesByVoiceReqSerializer =
_$GSearchPlacesReqSerializer(); _$GRecommendPlacesByVoiceReqSerializer();
class _$GSearchPlacesReqSerializer class _$GRecommendPlacesByVoiceReqSerializer
implements StructuredSerializer<GSearchPlacesReq> { implements StructuredSerializer<GRecommendPlacesByVoiceReq> {
@override @override
final Iterable<Type> types = const [GSearchPlacesReq, _$GSearchPlacesReq]; final Iterable<Type> types = const [
GRecommendPlacesByVoiceReq,
_$GRecommendPlacesByVoiceReq,
];
@override @override
final String wireName = 'GSearchPlacesReq'; final String wireName = 'GRecommendPlacesByVoiceReq';
@override @override
Iterable<Object?> serialize( Iterable<Object?> serialize(
Serializers serializers, Serializers serializers,
GSearchPlacesReq object, { GRecommendPlacesByVoiceReq object, {
FullType specifiedType = FullType.unspecified, FullType specifiedType = FullType.unspecified,
}) { }) {
final result = <Object?>[ final result = <Object?>[
'vars', 'vars',
serializers.serialize( serializers.serialize(
object.vars, object.vars,
specifiedType: const FullType(_i3.GSearchPlacesVars), specifiedType: const FullType(_i3.GRecommendPlacesByVoiceVars),
), ),
'operation', 'operation',
serializers.serialize( serializers.serialize(
@@ -55,7 +58,7 @@ class _$GSearchPlacesReqSerializer
..add( ..add(
serializers.serialize( serializers.serialize(
value, value,
specifiedType: const FullType(_i2.GSearchPlacesData), specifiedType: const FullType(_i2.GRecommendPlacesByVoiceData),
), ),
); );
} }
@@ -96,12 +99,12 @@ class _$GSearchPlacesReqSerializer
} }
@override @override
GSearchPlacesReq deserialize( GRecommendPlacesByVoiceReq deserialize(
Serializers serializers, Serializers serializers,
Iterable<Object?> serialized, { Iterable<Object?> serialized, {
FullType specifiedType = FullType.unspecified, FullType specifiedType = FullType.unspecified,
}) { }) {
final result = GSearchPlacesReqBuilder(); final result = GRecommendPlacesByVoiceReqBuilder();
final iterator = serialized.iterator; final iterator = serialized.iterator;
while (iterator.moveNext()) { while (iterator.moveNext()) {
@@ -113,9 +116,11 @@ class _$GSearchPlacesReqSerializer
result.vars.replace( result.vars.replace(
serializers.deserialize( serializers.deserialize(
value, value,
specifiedType: const FullType(_i3.GSearchPlacesVars), specifiedType: const FullType(
_i3.GRecommendPlacesByVoiceVars,
),
)! )!
as _i3.GSearchPlacesVars, as _i3.GRecommendPlacesByVoiceVars,
); );
break; break;
case 'operation': case 'operation':
@@ -138,9 +143,11 @@ class _$GSearchPlacesReqSerializer
result.optimisticResponse.replace( result.optimisticResponse.replace(
serializers.deserialize( serializers.deserialize(
value, value,
specifiedType: const FullType(_i2.GSearchPlacesData), specifiedType: const FullType(
_i2.GRecommendPlacesByVoiceData,
),
)! )!
as _i2.GSearchPlacesData, as _i2.GRecommendPlacesByVoiceData,
); );
break; break;
case 'updateCacheHandlerKey': case 'updateCacheHandlerKey':
@@ -185,21 +192,21 @@ class _$GSearchPlacesReqSerializer
} }
} }
class _$GSearchPlacesReq extends GSearchPlacesReq { class _$GRecommendPlacesByVoiceReq extends GRecommendPlacesByVoiceReq {
@override @override
final _i3.GSearchPlacesVars vars; final _i3.GRecommendPlacesByVoiceVars vars;
@override @override
final _i4.Operation operation; final _i4.Operation operation;
@override @override
final String? requestId; final String? requestId;
@override @override
final _i2.GSearchPlacesData? Function( final _i2.GRecommendPlacesByVoiceData? Function(
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
)? )?
updateResult; updateResult;
@override @override
final _i2.GSearchPlacesData? optimisticResponse; final _i2.GRecommendPlacesByVoiceData? optimisticResponse;
@override @override
final String? updateCacheHandlerKey; final String? updateCacheHandlerKey;
@override @override
@@ -211,11 +218,11 @@ class _$GSearchPlacesReq extends GSearchPlacesReq {
@override @override
final _i4.Context? context; final _i4.Context? context;
factory _$GSearchPlacesReq([ factory _$GRecommendPlacesByVoiceReq([
void Function(GSearchPlacesReqBuilder)? updates, void Function(GRecommendPlacesByVoiceReqBuilder)? updates,
]) => (GSearchPlacesReqBuilder()..update(updates))._build(); ]) => (GRecommendPlacesByVoiceReqBuilder()..update(updates))._build();
_$GSearchPlacesReq._({ _$GRecommendPlacesByVoiceReq._({
required this.vars, required this.vars,
required this.operation, required this.operation,
this.requestId, this.requestId,
@@ -228,17 +235,18 @@ class _$GSearchPlacesReq extends GSearchPlacesReq {
this.context, this.context,
}) : super._(); }) : super._();
@override @override
GSearchPlacesReq rebuild(void Function(GSearchPlacesReqBuilder) updates) => GRecommendPlacesByVoiceReq rebuild(
(toBuilder()..update(updates)).build(); void Function(GRecommendPlacesByVoiceReqBuilder) updates,
) => (toBuilder()..update(updates)).build();
@override @override
GSearchPlacesReqBuilder toBuilder() => GRecommendPlacesByVoiceReqBuilder toBuilder() =>
GSearchPlacesReqBuilder()..replace(this); GRecommendPlacesByVoiceReqBuilder()..replace(this);
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(other, this)) return true; if (identical(other, this)) return true;
return other is GSearchPlacesReq && return other is GRecommendPlacesByVoiceReq &&
vars == other.vars && vars == other.vars &&
operation == other.operation && operation == other.operation &&
requestId == other.requestId && requestId == other.requestId &&
@@ -270,7 +278,7 @@ class _$GSearchPlacesReq extends GSearchPlacesReq {
@override @override
String toString() { String toString() {
return (newBuiltValueToStringHelper(r'GSearchPlacesReq') return (newBuiltValueToStringHelper(r'GRecommendPlacesByVoiceReq')
..add('vars', vars) ..add('vars', vars)
..add('operation', operation) ..add('operation', operation)
..add('requestId', requestId) ..add('requestId', requestId)
@@ -285,14 +293,15 @@ class _$GSearchPlacesReq extends GSearchPlacesReq {
} }
} }
class GSearchPlacesReqBuilder class GRecommendPlacesByVoiceReqBuilder
implements Builder<GSearchPlacesReq, GSearchPlacesReqBuilder> { implements
_$GSearchPlacesReq? _$v; Builder<GRecommendPlacesByVoiceReq, GRecommendPlacesByVoiceReqBuilder> {
_$GRecommendPlacesByVoiceReq? _$v;
_i3.GSearchPlacesVarsBuilder? _vars; _i3.GRecommendPlacesByVoiceVarsBuilder? _vars;
_i3.GSearchPlacesVarsBuilder get vars => _i3.GRecommendPlacesByVoiceVarsBuilder get vars =>
_$this._vars ??= _i3.GSearchPlacesVarsBuilder(); _$this._vars ??= _i3.GRecommendPlacesByVoiceVarsBuilder();
set vars(_i3.GSearchPlacesVarsBuilder? vars) => _$this._vars = vars; set vars(_i3.GRecommendPlacesByVoiceVarsBuilder? vars) => _$this._vars = vars;
_i4.Operation? _operation; _i4.Operation? _operation;
_i4.Operation? get operation => _$this._operation; _i4.Operation? get operation => _$this._operation;
@@ -302,29 +311,30 @@ class GSearchPlacesReqBuilder
String? get requestId => _$this._requestId; String? get requestId => _$this._requestId;
set requestId(String? requestId) => _$this._requestId = requestId; set requestId(String? requestId) => _$this._requestId = requestId;
_i2.GSearchPlacesData? Function( _i2.GRecommendPlacesByVoiceData? Function(
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
)? )?
_updateResult; _updateResult;
_i2.GSearchPlacesData? Function( _i2.GRecommendPlacesByVoiceData? Function(
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
)? )?
get updateResult => _$this._updateResult; get updateResult => _$this._updateResult;
set updateResult( set updateResult(
_i2.GSearchPlacesData? Function( _i2.GRecommendPlacesByVoiceData? Function(
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
_i2.GSearchPlacesData?, _i2.GRecommendPlacesByVoiceData?,
)? )?
updateResult, updateResult,
) => _$this._updateResult = updateResult; ) => _$this._updateResult = updateResult;
_i2.GSearchPlacesDataBuilder? _optimisticResponse; _i2.GRecommendPlacesByVoiceDataBuilder? _optimisticResponse;
_i2.GSearchPlacesDataBuilder get optimisticResponse => _i2.GRecommendPlacesByVoiceDataBuilder get optimisticResponse =>
_$this._optimisticResponse ??= _i2.GSearchPlacesDataBuilder(); _$this._optimisticResponse ??= _i2.GRecommendPlacesByVoiceDataBuilder();
set optimisticResponse(_i2.GSearchPlacesDataBuilder? optimisticResponse) => set optimisticResponse(
_$this._optimisticResponse = optimisticResponse; _i2.GRecommendPlacesByVoiceDataBuilder? optimisticResponse,
) => _$this._optimisticResponse = optimisticResponse;
String? _updateCacheHandlerKey; String? _updateCacheHandlerKey;
String? get updateCacheHandlerKey => _$this._updateCacheHandlerKey; String? get updateCacheHandlerKey => _$this._updateCacheHandlerKey;
@@ -352,11 +362,11 @@ class GSearchPlacesReqBuilder
_i4.Context? get context => _$this._context; _i4.Context? get context => _$this._context;
set context(_i4.Context? context) => _$this._context = context; set context(_i4.Context? context) => _$this._context = context;
GSearchPlacesReqBuilder() { GRecommendPlacesByVoiceReqBuilder() {
GSearchPlacesReq._initializeBuilder(this); GRecommendPlacesByVoiceReq._initializeBuilder(this);
} }
GSearchPlacesReqBuilder get _$this { GRecommendPlacesByVoiceReqBuilder get _$this {
final $v = _$v; final $v = _$v;
if ($v != null) { if ($v != null) {
_vars = $v.vars.toBuilder(); _vars = $v.vars.toBuilder();
@@ -375,28 +385,28 @@ class GSearchPlacesReqBuilder
} }
@override @override
void replace(GSearchPlacesReq other) { void replace(GRecommendPlacesByVoiceReq other) {
_$v = other as _$GSearchPlacesReq; _$v = other as _$GRecommendPlacesByVoiceReq;
} }
@override @override
void update(void Function(GSearchPlacesReqBuilder)? updates) { void update(void Function(GRecommendPlacesByVoiceReqBuilder)? updates) {
if (updates != null) updates(this); if (updates != null) updates(this);
} }
@override @override
GSearchPlacesReq build() => _build(); GRecommendPlacesByVoiceReq build() => _build();
_$GSearchPlacesReq _build() { _$GRecommendPlacesByVoiceReq _build() {
_$GSearchPlacesReq _$result; _$GRecommendPlacesByVoiceReq _$result;
try { try {
_$result = _$result =
_$v ?? _$v ??
_$GSearchPlacesReq._( _$GRecommendPlacesByVoiceReq._(
vars: vars.build(), vars: vars.build(),
operation: BuiltValueNullFieldError.checkNotNull( operation: BuiltValueNullFieldError.checkNotNull(
operation, operation,
r'GSearchPlacesReq', r'GRecommendPlacesByVoiceReq',
'operation', 'operation',
), ),
requestId: requestId, requestId: requestId,
@@ -407,7 +417,7 @@ class GSearchPlacesReqBuilder
fetchPolicy: fetchPolicy, fetchPolicy: fetchPolicy,
executeOnListen: BuiltValueNullFieldError.checkNotNull( executeOnListen: BuiltValueNullFieldError.checkNotNull(
executeOnListen, executeOnListen,
r'GSearchPlacesReq', r'GRecommendPlacesByVoiceReq',
'executeOnListen', 'executeOnListen',
), ),
context: context, context: context,
@@ -422,7 +432,7 @@ class GSearchPlacesReqBuilder
_optimisticResponse?.build(); _optimisticResponse?.build();
} catch (e) { } catch (e) {
throw BuiltValueNestedFieldError( throw BuiltValueNestedFieldError(
r'GSearchPlacesReq', r'GRecommendPlacesByVoiceReq',
_$failedField, _$failedField,
e.toString(), e.toString(),
); );
@@ -0,0 +1,37 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:mapflow/features/mapflow/data/graphql/__generated__/schema.schema.gql.dart'
as _i1;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/serializers.gql.dart'
as _i2;
part 'recommend_places_by_voice.var.gql.g.dart';
abstract class GRecommendPlacesByVoiceVars
implements
Built<GRecommendPlacesByVoiceVars, GRecommendPlacesByVoiceVarsBuilder> {
GRecommendPlacesByVoiceVars._();
factory GRecommendPlacesByVoiceVars([
void Function(GRecommendPlacesByVoiceVarsBuilder b) updates,
]) = _$GRecommendPlacesByVoiceVars;
_i1.GVoicePlaceRecommendationsInput get input;
static Serializer<GRecommendPlacesByVoiceVars> get serializer =>
_$gRecommendPlacesByVoiceVarsSerializer;
Map<String, dynamic> toJson() =>
(_i2.serializers.serializeWith(
GRecommendPlacesByVoiceVars.serializer,
this,
)
as Map<String, dynamic>);
static GRecommendPlacesByVoiceVars? fromJson(Map<String, dynamic> json) => _i2
.serializers
.deserializeWith(GRecommendPlacesByVoiceVars.serializer, json);
}
@@ -0,0 +1,173 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'recommend_places_by_voice.var.gql.dart';
// **************************************************************************
// BuiltValueGenerator
// **************************************************************************
Serializer<GRecommendPlacesByVoiceVars>
_$gRecommendPlacesByVoiceVarsSerializer =
_$GRecommendPlacesByVoiceVarsSerializer();
class _$GRecommendPlacesByVoiceVarsSerializer
implements StructuredSerializer<GRecommendPlacesByVoiceVars> {
@override
final Iterable<Type> types = const [
GRecommendPlacesByVoiceVars,
_$GRecommendPlacesByVoiceVars,
];
@override
final String wireName = 'GRecommendPlacesByVoiceVars';
@override
Iterable<Object?> serialize(
Serializers serializers,
GRecommendPlacesByVoiceVars object, {
FullType specifiedType = FullType.unspecified,
}) {
final result = <Object?>[
'input',
serializers.serialize(
object.input,
specifiedType: const FullType(_i1.GVoicePlaceRecommendationsInput),
),
];
return result;
}
@override
GRecommendPlacesByVoiceVars deserialize(
Serializers serializers,
Iterable<Object?> serialized, {
FullType specifiedType = FullType.unspecified,
}) {
final result = GRecommendPlacesByVoiceVarsBuilder();
final iterator = serialized.iterator;
while (iterator.moveNext()) {
final key = iterator.current! as String;
iterator.moveNext();
final Object? value = iterator.current;
switch (key) {
case 'input':
result.input.replace(
serializers.deserialize(
value,
specifiedType: const FullType(
_i1.GVoicePlaceRecommendationsInput,
),
)!
as _i1.GVoicePlaceRecommendationsInput,
);
break;
}
}
return result.build();
}
}
class _$GRecommendPlacesByVoiceVars extends GRecommendPlacesByVoiceVars {
@override
final _i1.GVoicePlaceRecommendationsInput input;
factory _$GRecommendPlacesByVoiceVars([
void Function(GRecommendPlacesByVoiceVarsBuilder)? updates,
]) => (GRecommendPlacesByVoiceVarsBuilder()..update(updates))._build();
_$GRecommendPlacesByVoiceVars._({required this.input}) : super._();
@override
GRecommendPlacesByVoiceVars rebuild(
void Function(GRecommendPlacesByVoiceVarsBuilder) updates,
) => (toBuilder()..update(updates)).build();
@override
GRecommendPlacesByVoiceVarsBuilder toBuilder() =>
GRecommendPlacesByVoiceVarsBuilder()..replace(this);
@override
bool operator ==(Object other) {
if (identical(other, this)) return true;
return other is GRecommendPlacesByVoiceVars && input == other.input;
}
@override
int get hashCode {
var _$hash = 0;
_$hash = $jc(_$hash, input.hashCode);
_$hash = $jf(_$hash);
return _$hash;
}
@override
String toString() {
return (newBuiltValueToStringHelper(
r'GRecommendPlacesByVoiceVars',
)..add('input', input)).toString();
}
}
class GRecommendPlacesByVoiceVarsBuilder
implements
Builder<
GRecommendPlacesByVoiceVars,
GRecommendPlacesByVoiceVarsBuilder
> {
_$GRecommendPlacesByVoiceVars? _$v;
_i1.GVoicePlaceRecommendationsInputBuilder? _input;
_i1.GVoicePlaceRecommendationsInputBuilder get input =>
_$this._input ??= _i1.GVoicePlaceRecommendationsInputBuilder();
set input(_i1.GVoicePlaceRecommendationsInputBuilder? input) =>
_$this._input = input;
GRecommendPlacesByVoiceVarsBuilder();
GRecommendPlacesByVoiceVarsBuilder get _$this {
final $v = _$v;
if ($v != null) {
_input = $v.input.toBuilder();
_$v = null;
}
return this;
}
@override
void replace(GRecommendPlacesByVoiceVars other) {
_$v = other as _$GRecommendPlacesByVoiceVars;
}
@override
void update(void Function(GRecommendPlacesByVoiceVarsBuilder)? updates) {
if (updates != null) updates(this);
}
@override
GRecommendPlacesByVoiceVars build() => _build();
_$GRecommendPlacesByVoiceVars _build() {
_$GRecommendPlacesByVoiceVars _$result;
try {
_$result = _$v ?? _$GRecommendPlacesByVoiceVars._(input: input.build());
} catch (_) {
late String _$failedField;
try {
_$failedField = 'input';
input.build();
} catch (e) {
throw BuiltValueNestedFieldError(
r'GRecommendPlacesByVoiceVars',
_$failedField,
e.toString(),
);
}
rethrow;
}
replace(_$result);
return _$result;
}
}
// ignore_for_file: deprecated_member_use_from_same_package,type=lint
@@ -569,12 +569,21 @@ const NearbyPlacesInput = _i1.InputObjectTypeDefinitionNode(
), ),
], ],
); );
const SearchPlacesInput = _i1.InputObjectTypeDefinitionNode( const VoicePlaceRecommendationsInput = _i1.InputObjectTypeDefinitionNode(
name: _i1.NameNode(value: 'SearchPlacesInput'), name: _i1.NameNode(value: 'VoicePlaceRecommendationsInput'),
directives: [], directives: [],
fields: [ fields: [
_i1.InputValueDefinitionNode( _i1.InputValueDefinitionNode(
name: _i1.NameNode(value: 'query'), name: _i1.NameNode(value: 'audioContentBase64'),
directives: [],
type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'String'),
isNonNull: true,
),
defaultValue: null,
),
_i1.InputValueDefinitionNode(
name: _i1.NameNode(value: 'audioMimeType'),
directives: [], directives: [],
type: _i1.NamedTypeNode( type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'String'), name: _i1.NameNode(value: 'String'),
@@ -743,13 +752,34 @@ const TelegramBotLoginSession = _i1.ObjectTypeDefinitionNode(
), ),
], ],
); );
const SearchPlacesPayload = _i1.ObjectTypeDefinitionNode( const VoicePlaceRecommendationsPayload = _i1.ObjectTypeDefinitionNode(
name: _i1.NameNode(value: 'SearchPlacesPayload'), name: _i1.NameNode(value: 'VoicePlaceRecommendationsPayload'),
directives: [], directives: [],
interfaces: [], interfaces: [],
fields: [ fields: [
_i1.FieldDefinitionNode( _i1.FieldDefinitionNode(
name: _i1.NameNode(value: 'message'), name: _i1.NameNode(value: 'transcript'),
directives: [],
args: [],
type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'String'),
isNonNull: true,
),
),
_i1.FieldDefinitionNode(
name: _i1.NameNode(value: 'tags'),
directives: [],
args: [],
type: _i1.ListTypeNode(
type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'String'),
isNonNull: true,
),
isNonNull: true,
),
),
_i1.FieldDefinitionNode(
name: _i1.NameNode(value: 'summary'),
directives: [], directives: [],
args: [], args: [],
type: _i1.NamedTypeNode( type: _i1.NamedTypeNode(
@@ -840,25 +870,6 @@ const Query = _i1.ObjectTypeDefinitionNode(
isNonNull: true, isNonNull: true,
), ),
), ),
_i1.FieldDefinitionNode(
name: _i1.NameNode(value: 'searchPlaces'),
directives: [],
args: [
_i1.InputValueDefinitionNode(
name: _i1.NameNode(value: 'input'),
directives: [],
type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'SearchPlacesInput'),
isNonNull: true,
),
defaultValue: null,
),
],
type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'SearchPlacesPayload'),
isNonNull: true,
),
),
_i1.FieldDefinitionNode( _i1.FieldDefinitionNode(
name: _i1.NameNode(value: 'voiceExperiences'), name: _i1.NameNode(value: 'voiceExperiences'),
directives: [], directives: [],
@@ -963,6 +974,25 @@ const Mutation = _i1.ObjectTypeDefinitionNode(
isNonNull: true, isNonNull: true,
), ),
), ),
_i1.FieldDefinitionNode(
name: _i1.NameNode(value: 'recommendPlacesByVoice'),
directives: [],
args: [
_i1.InputValueDefinitionNode(
name: _i1.NameNode(value: 'input'),
directives: [],
type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'VoicePlaceRecommendationsInput'),
isNonNull: true,
),
defaultValue: null,
),
],
type: _i1.NamedTypeNode(
name: _i1.NameNode(value: 'VoicePlaceRecommendationsPayload'),
isNonNull: true,
),
),
_i1.FieldDefinitionNode( _i1.FieldDefinitionNode(
name: _i1.NameNode(value: 'addFavoritePlace'), name: _i1.NameNode(value: 'addFavoritePlace'),
directives: [], directives: [],
@@ -1012,13 +1042,13 @@ const document = _i1.DocumentNode(
VoiceExperience, VoiceExperience,
CreateVoiceExperienceInput, CreateVoiceExperienceInput,
NearbyPlacesInput, NearbyPlacesInput,
SearchPlacesInput, VoicePlaceRecommendationsInput,
AuthenticateTelegramInput, AuthenticateTelegramInput,
AuthenticateTelegramLoginInput, AuthenticateTelegramLoginInput,
AuthPayload, AuthPayload,
TelegramBotLoginPayload, TelegramBotLoginPayload,
TelegramBotLoginSession, TelegramBotLoginSession,
SearchPlacesPayload, VoicePlaceRecommendationsPayload,
Query, Query,
Mutation, Mutation,
], ],
@@ -100,24 +100,35 @@ abstract class GNearbyPlacesInput
_i2.serializers.deserializeWith(GNearbyPlacesInput.serializer, json); _i2.serializers.deserializeWith(GNearbyPlacesInput.serializer, json);
} }
abstract class GSearchPlacesInput abstract class GVoicePlaceRecommendationsInput
implements Built<GSearchPlacesInput, GSearchPlacesInputBuilder> { implements
GSearchPlacesInput._(); Built<
GVoicePlaceRecommendationsInput,
GVoicePlaceRecommendationsInputBuilder
> {
GVoicePlaceRecommendationsInput._();
factory GSearchPlacesInput([ factory GVoicePlaceRecommendationsInput([
void Function(GSearchPlacesInputBuilder b) updates, void Function(GVoicePlaceRecommendationsInputBuilder b) updates,
]) = _$GSearchPlacesInput; ]) = _$GVoicePlaceRecommendationsInput;
String get query; String get audioContentBase64;
static Serializer<GSearchPlacesInput> get serializer => String get audioMimeType;
_$gSearchPlacesInputSerializer; static Serializer<GVoicePlaceRecommendationsInput> get serializer =>
_$gVoicePlaceRecommendationsInputSerializer;
Map<String, dynamic> toJson() => Map<String, dynamic> toJson() =>
(_i2.serializers.serializeWith(GSearchPlacesInput.serializer, this) (_i2.serializers.serializeWith(
GVoicePlaceRecommendationsInput.serializer,
this,
)
as Map<String, dynamic>); as Map<String, dynamic>);
static GSearchPlacesInput? fromJson(Map<String, dynamic> json) => static GVoicePlaceRecommendationsInput? fromJson(Map<String, dynamic> json) =>
_i2.serializers.deserializeWith(GSearchPlacesInput.serializer, json); _i2.serializers.deserializeWith(
GVoicePlaceRecommendationsInput.serializer,
json,
);
} }
abstract class GAuthenticateTelegramInput abstract class GAuthenticateTelegramInput
@@ -55,8 +55,9 @@ _$gCreateVoiceExperienceInputSerializer =
_$GCreateVoiceExperienceInputSerializer(); _$GCreateVoiceExperienceInputSerializer();
Serializer<GNearbyPlacesInput> _$gNearbyPlacesInputSerializer = Serializer<GNearbyPlacesInput> _$gNearbyPlacesInputSerializer =
_$GNearbyPlacesInputSerializer(); _$GNearbyPlacesInputSerializer();
Serializer<GSearchPlacesInput> _$gSearchPlacesInputSerializer = Serializer<GVoicePlaceRecommendationsInput>
_$GSearchPlacesInputSerializer(); _$gVoicePlaceRecommendationsInputSerializer =
_$GVoicePlaceRecommendationsInputSerializer();
Serializer<GAuthenticateTelegramInput> _$gAuthenticateTelegramInputSerializer = Serializer<GAuthenticateTelegramInput> _$gAuthenticateTelegramInputSerializer =
_$GAuthenticateTelegramInputSerializer(); _$GAuthenticateTelegramInputSerializer();
Serializer<GAuthenticateTelegramLoginInput> Serializer<GAuthenticateTelegramLoginInput>
@@ -410,23 +411,31 @@ class _$GNearbyPlacesInputSerializer
} }
} }
class _$GSearchPlacesInputSerializer class _$GVoicePlaceRecommendationsInputSerializer
implements StructuredSerializer<GSearchPlacesInput> { implements StructuredSerializer<GVoicePlaceRecommendationsInput> {
@override @override
final Iterable<Type> types = const [GSearchPlacesInput, _$GSearchPlacesInput]; final Iterable<Type> types = const [
GVoicePlaceRecommendationsInput,
_$GVoicePlaceRecommendationsInput,
];
@override @override
final String wireName = 'GSearchPlacesInput'; final String wireName = 'GVoicePlaceRecommendationsInput';
@override @override
Iterable<Object?> serialize( Iterable<Object?> serialize(
Serializers serializers, Serializers serializers,
GSearchPlacesInput object, { GVoicePlaceRecommendationsInput object, {
FullType specifiedType = FullType.unspecified, FullType specifiedType = FullType.unspecified,
}) { }) {
final result = <Object?>[ final result = <Object?>[
'query', 'audioContentBase64',
serializers.serialize( serializers.serialize(
object.query, object.audioContentBase64,
specifiedType: const FullType(String),
),
'audioMimeType',
serializers.serialize(
object.audioMimeType,
specifiedType: const FullType(String), specifiedType: const FullType(String),
), ),
]; ];
@@ -435,12 +444,12 @@ class _$GSearchPlacesInputSerializer
} }
@override @override
GSearchPlacesInput deserialize( GVoicePlaceRecommendationsInput deserialize(
Serializers serializers, Serializers serializers,
Iterable<Object?> serialized, { Iterable<Object?> serialized, {
FullType specifiedType = FullType.unspecified, FullType specifiedType = FullType.unspecified,
}) { }) {
final result = GSearchPlacesInputBuilder(); final result = GVoicePlaceRecommendationsInputBuilder();
final iterator = serialized.iterator; final iterator = serialized.iterator;
while (iterator.moveNext()) { while (iterator.moveNext()) {
@@ -448,8 +457,16 @@ class _$GSearchPlacesInputSerializer
iterator.moveNext(); iterator.moveNext();
final Object? value = iterator.current; final Object? value = iterator.current;
switch (key) { switch (key) {
case 'query': case 'audioContentBase64':
result.query = result.audioContentBase64 =
serializers.deserialize(
value,
specifiedType: const FullType(String),
)!
as String;
break;
case 'audioMimeType':
result.audioMimeType =
serializers.deserialize( serializers.deserialize(
value, value,
specifiedType: const FullType(String), specifiedType: const FullType(String),
@@ -1078,86 +1095,112 @@ class GNearbyPlacesInputBuilder
} }
} }
class _$GSearchPlacesInput extends GSearchPlacesInput { class _$GVoicePlaceRecommendationsInput
extends GVoicePlaceRecommendationsInput {
@override @override
final String query; final String audioContentBase64;
factory _$GSearchPlacesInput([
void Function(GSearchPlacesInputBuilder)? updates,
]) => (GSearchPlacesInputBuilder()..update(updates))._build();
_$GSearchPlacesInput._({required this.query}) : super._();
@override @override
GSearchPlacesInput rebuild( final String audioMimeType;
void Function(GSearchPlacesInputBuilder) updates,
factory _$GVoicePlaceRecommendationsInput([
void Function(GVoicePlaceRecommendationsInputBuilder)? updates,
]) => (GVoicePlaceRecommendationsInputBuilder()..update(updates))._build();
_$GVoicePlaceRecommendationsInput._({
required this.audioContentBase64,
required this.audioMimeType,
}) : super._();
@override
GVoicePlaceRecommendationsInput rebuild(
void Function(GVoicePlaceRecommendationsInputBuilder) updates,
) => (toBuilder()..update(updates)).build(); ) => (toBuilder()..update(updates)).build();
@override @override
GSearchPlacesInputBuilder toBuilder() => GVoicePlaceRecommendationsInputBuilder toBuilder() =>
GSearchPlacesInputBuilder()..replace(this); GVoicePlaceRecommendationsInputBuilder()..replace(this);
@override @override
bool operator ==(Object other) { bool operator ==(Object other) {
if (identical(other, this)) return true; if (identical(other, this)) return true;
return other is GSearchPlacesInput && query == other.query; return other is GVoicePlaceRecommendationsInput &&
audioContentBase64 == other.audioContentBase64 &&
audioMimeType == other.audioMimeType;
} }
@override @override
int get hashCode { int get hashCode {
var _$hash = 0; var _$hash = 0;
_$hash = $jc(_$hash, query.hashCode); _$hash = $jc(_$hash, audioContentBase64.hashCode);
_$hash = $jc(_$hash, audioMimeType.hashCode);
_$hash = $jf(_$hash); _$hash = $jf(_$hash);
return _$hash; return _$hash;
} }
@override @override
String toString() { String toString() {
return (newBuiltValueToStringHelper( return (newBuiltValueToStringHelper(r'GVoicePlaceRecommendationsInput')
r'GSearchPlacesInput', ..add('audioContentBase64', audioContentBase64)
)..add('query', query)).toString(); ..add('audioMimeType', audioMimeType))
.toString();
} }
} }
class GSearchPlacesInputBuilder class GVoicePlaceRecommendationsInputBuilder
implements Builder<GSearchPlacesInput, GSearchPlacesInputBuilder> { implements
_$GSearchPlacesInput? _$v; Builder<
GVoicePlaceRecommendationsInput,
GVoicePlaceRecommendationsInputBuilder
> {
_$GVoicePlaceRecommendationsInput? _$v;
String? _query; String? _audioContentBase64;
String? get query => _$this._query; String? get audioContentBase64 => _$this._audioContentBase64;
set query(String? query) => _$this._query = query; set audioContentBase64(String? audioContentBase64) =>
_$this._audioContentBase64 = audioContentBase64;
GSearchPlacesInputBuilder(); String? _audioMimeType;
String? get audioMimeType => _$this._audioMimeType;
set audioMimeType(String? audioMimeType) =>
_$this._audioMimeType = audioMimeType;
GSearchPlacesInputBuilder get _$this { GVoicePlaceRecommendationsInputBuilder();
GVoicePlaceRecommendationsInputBuilder get _$this {
final $v = _$v; final $v = _$v;
if ($v != null) { if ($v != null) {
_query = $v.query; _audioContentBase64 = $v.audioContentBase64;
_audioMimeType = $v.audioMimeType;
_$v = null; _$v = null;
} }
return this; return this;
} }
@override @override
void replace(GSearchPlacesInput other) { void replace(GVoicePlaceRecommendationsInput other) {
_$v = other as _$GSearchPlacesInput; _$v = other as _$GVoicePlaceRecommendationsInput;
} }
@override @override
void update(void Function(GSearchPlacesInputBuilder)? updates) { void update(void Function(GVoicePlaceRecommendationsInputBuilder)? updates) {
if (updates != null) updates(this); if (updates != null) updates(this);
} }
@override @override
GSearchPlacesInput build() => _build(); GVoicePlaceRecommendationsInput build() => _build();
_$GSearchPlacesInput _build() { _$GVoicePlaceRecommendationsInput _build() {
final _$result = final _$result =
_$v ?? _$v ??
_$GSearchPlacesInput._( _$GVoicePlaceRecommendationsInput._(
query: BuiltValueNullFieldError.checkNotNull( audioContentBase64: BuiltValueNullFieldError.checkNotNull(
query, audioContentBase64,
r'GSearchPlacesInput', r'GVoicePlaceRecommendationsInput',
'query', 'audioContentBase64',
),
audioMimeType: BuiltValueNullFieldError.checkNotNull(
audioMimeType,
r'GVoicePlaceRecommendationsInput',
'audioMimeType',
), ),
); );
replace(_$result); replace(_$result);
@@ -1,167 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:built_collection/built_collection.dart';
import 'package:built_value/built_value.dart';
import 'package:built_value/json_object.dart' as _i2;
import 'package:built_value/serializer.dart';
import 'package:mapflow/features/mapflow/data/graphql/__generated__/schema.schema.gql.dart'
as _i3;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/serializers.gql.dart'
as _i1;
part 'search_places.data.gql.g.dart';
abstract class GSearchPlacesData
implements Built<GSearchPlacesData, GSearchPlacesDataBuilder> {
GSearchPlacesData._();
factory GSearchPlacesData([
void Function(GSearchPlacesDataBuilder b) updates,
]) = _$GSearchPlacesData;
static void _initializeBuilder(GSearchPlacesDataBuilder b) =>
b..G__typename = 'Query';
@BuiltValueField(wireName: '__typename')
String get G__typename;
GSearchPlacesData_searchPlaces get searchPlaces;
static Serializer<GSearchPlacesData> get serializer =>
_$gSearchPlacesDataSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(GSearchPlacesData.serializer, this)
as Map<String, dynamic>);
static GSearchPlacesData? fromJson(Map<String, dynamic> json) =>
_i1.serializers.deserializeWith(GSearchPlacesData.serializer, json);
}
abstract class GSearchPlacesData_searchPlaces
implements
Built<
GSearchPlacesData_searchPlaces,
GSearchPlacesData_searchPlacesBuilder
> {
GSearchPlacesData_searchPlaces._();
factory GSearchPlacesData_searchPlaces([
void Function(GSearchPlacesData_searchPlacesBuilder b) updates,
]) = _$GSearchPlacesData_searchPlaces;
static void _initializeBuilder(GSearchPlacesData_searchPlacesBuilder b) =>
b..G__typename = 'SearchPlacesPayload';
@BuiltValueField(wireName: '__typename')
String get G__typename;
String get message;
BuiltList<GSearchPlacesData_searchPlaces_places> get places;
static Serializer<GSearchPlacesData_searchPlaces> get serializer =>
_$gSearchPlacesDataSearchPlacesSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(
GSearchPlacesData_searchPlaces.serializer,
this,
)
as Map<String, dynamic>);
static GSearchPlacesData_searchPlaces? fromJson(Map<String, dynamic> json) =>
_i1.serializers.deserializeWith(
GSearchPlacesData_searchPlaces.serializer,
json,
);
}
abstract class GSearchPlacesData_searchPlaces_places
implements
Built<
GSearchPlacesData_searchPlaces_places,
GSearchPlacesData_searchPlaces_placesBuilder
> {
GSearchPlacesData_searchPlaces_places._();
factory GSearchPlacesData_searchPlaces_places([
void Function(GSearchPlacesData_searchPlaces_placesBuilder b) updates,
]) = _$GSearchPlacesData_searchPlaces_places;
static void _initializeBuilder(
GSearchPlacesData_searchPlaces_placesBuilder b,
) => b..G__typename = 'Place';
@BuiltValueField(wireName: '__typename')
String get G__typename;
String get id;
String get googlePlaceId;
String get name;
double get latitude;
double get longitude;
String? get googlePrimaryType;
BuiltList<String> get googleTypes;
String? get googleBusinessStatus;
double? get googleRating;
int? get googleUserRatingCount;
_i2.JsonObject? get googleRegularOpeningHours;
_i2.JsonObject? get googleCurrentOpeningHours;
BuiltList<String> get photoUrls;
BuiltList<String> get traits;
bool get isFavorite;
BuiltList<GSearchPlacesData_searchPlaces_places_experiences> get experiences;
static Serializer<GSearchPlacesData_searchPlaces_places> get serializer =>
_$gSearchPlacesDataSearchPlacesPlacesSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(
GSearchPlacesData_searchPlaces_places.serializer,
this,
)
as Map<String, dynamic>);
static GSearchPlacesData_searchPlaces_places? fromJson(
Map<String, dynamic> json,
) => _i1.serializers.deserializeWith(
GSearchPlacesData_searchPlaces_places.serializer,
json,
);
}
abstract class GSearchPlacesData_searchPlaces_places_experiences
implements
Built<
GSearchPlacesData_searchPlaces_places_experiences,
GSearchPlacesData_searchPlaces_places_experiencesBuilder
> {
GSearchPlacesData_searchPlaces_places_experiences._();
factory GSearchPlacesData_searchPlaces_places_experiences([
void Function(GSearchPlacesData_searchPlaces_places_experiencesBuilder b)
updates,
]) = _$GSearchPlacesData_searchPlaces_places_experiences;
static void _initializeBuilder(
GSearchPlacesData_searchPlaces_places_experiencesBuilder b,
) => b..G__typename = 'VoiceExperience';
@BuiltValueField(wireName: '__typename')
String get G__typename;
String get id;
_i3.GVoiceExperienceStatus get status;
String get createdAt;
static Serializer<GSearchPlacesData_searchPlaces_places_experiences>
get serializer => _$gSearchPlacesDataSearchPlacesPlacesExperiencesSerializer;
Map<String, dynamic> toJson() =>
(_i1.serializers.serializeWith(
GSearchPlacesData_searchPlaces_places_experiences.serializer,
this,
)
as Map<String, dynamic>);
static GSearchPlacesData_searchPlaces_places_experiences? fromJson(
Map<String, dynamic> json,
) => _i1.serializers.deserializeWith(
GSearchPlacesData_searchPlaces_places_experiences.serializer,
json,
);
}
@@ -1,32 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: no_leading_underscores_for_library_prefixes
import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';
import 'package:mapflow/features/mapflow/data/graphql/__generated__/schema.schema.gql.dart'
as _i1;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/serializers.gql.dart'
as _i2;
part 'search_places.var.gql.g.dart';
abstract class GSearchPlacesVars
implements Built<GSearchPlacesVars, GSearchPlacesVarsBuilder> {
GSearchPlacesVars._();
factory GSearchPlacesVars([
void Function(GSearchPlacesVarsBuilder b) updates,
]) = _$GSearchPlacesVars;
_i1.GSearchPlacesInput get input;
static Serializer<GSearchPlacesVars> get serializer =>
_$gSearchPlacesVarsSerializer;
Map<String, dynamic> toJson() =>
(_i2.serializers.serializeWith(GSearchPlacesVars.serializer, this)
as Map<String, dynamic>);
static GSearchPlacesVars? fromJson(Map<String, dynamic> json) =>
_i2.serializers.deserializeWith(GSearchPlacesVars.serializer, json);
}
@@ -1,161 +0,0 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'search_places.var.gql.dart';
// **************************************************************************
// BuiltValueGenerator
// **************************************************************************
Serializer<GSearchPlacesVars> _$gSearchPlacesVarsSerializer =
_$GSearchPlacesVarsSerializer();
class _$GSearchPlacesVarsSerializer
implements StructuredSerializer<GSearchPlacesVars> {
@override
final Iterable<Type> types = const [GSearchPlacesVars, _$GSearchPlacesVars];
@override
final String wireName = 'GSearchPlacesVars';
@override
Iterable<Object?> serialize(
Serializers serializers,
GSearchPlacesVars object, {
FullType specifiedType = FullType.unspecified,
}) {
final result = <Object?>[
'input',
serializers.serialize(
object.input,
specifiedType: const FullType(_i1.GSearchPlacesInput),
),
];
return result;
}
@override
GSearchPlacesVars deserialize(
Serializers serializers,
Iterable<Object?> serialized, {
FullType specifiedType = FullType.unspecified,
}) {
final result = GSearchPlacesVarsBuilder();
final iterator = serialized.iterator;
while (iterator.moveNext()) {
final key = iterator.current! as String;
iterator.moveNext();
final Object? value = iterator.current;
switch (key) {
case 'input':
result.input.replace(
serializers.deserialize(
value,
specifiedType: const FullType(_i1.GSearchPlacesInput),
)!
as _i1.GSearchPlacesInput,
);
break;
}
}
return result.build();
}
}
class _$GSearchPlacesVars extends GSearchPlacesVars {
@override
final _i1.GSearchPlacesInput input;
factory _$GSearchPlacesVars([
void Function(GSearchPlacesVarsBuilder)? updates,
]) => (GSearchPlacesVarsBuilder()..update(updates))._build();
_$GSearchPlacesVars._({required this.input}) : super._();
@override
GSearchPlacesVars rebuild(void Function(GSearchPlacesVarsBuilder) updates) =>
(toBuilder()..update(updates)).build();
@override
GSearchPlacesVarsBuilder toBuilder() =>
GSearchPlacesVarsBuilder()..replace(this);
@override
bool operator ==(Object other) {
if (identical(other, this)) return true;
return other is GSearchPlacesVars && input == other.input;
}
@override
int get hashCode {
var _$hash = 0;
_$hash = $jc(_$hash, input.hashCode);
_$hash = $jf(_$hash);
return _$hash;
}
@override
String toString() {
return (newBuiltValueToStringHelper(
r'GSearchPlacesVars',
)..add('input', input)).toString();
}
}
class GSearchPlacesVarsBuilder
implements Builder<GSearchPlacesVars, GSearchPlacesVarsBuilder> {
_$GSearchPlacesVars? _$v;
_i1.GSearchPlacesInputBuilder? _input;
_i1.GSearchPlacesInputBuilder get input =>
_$this._input ??= _i1.GSearchPlacesInputBuilder();
set input(_i1.GSearchPlacesInputBuilder? input) => _$this._input = input;
GSearchPlacesVarsBuilder();
GSearchPlacesVarsBuilder get _$this {
final $v = _$v;
if ($v != null) {
_input = $v.input.toBuilder();
_$v = null;
}
return this;
}
@override
void replace(GSearchPlacesVars other) {
_$v = other as _$GSearchPlacesVars;
}
@override
void update(void Function(GSearchPlacesVarsBuilder)? updates) {
if (updates != null) updates(this);
}
@override
GSearchPlacesVars build() => _build();
_$GSearchPlacesVars _build() {
_$GSearchPlacesVars _$result;
try {
_$result = _$v ?? _$GSearchPlacesVars._(input: input.build());
} catch (_) {
late String _$failedField;
try {
_$failedField = 'input';
input.build();
} catch (e) {
throw BuiltValueNestedFieldError(
r'GSearchPlacesVars',
_$failedField,
e.toString(),
);
}
rethrow;
}
replace(_$result);
return _$result;
}
}
// ignore_for_file: deprecated_member_use_from_same_package,type=lint
@@ -82,6 +82,16 @@ import 'package:mapflow/features/mapflow/data/graphql/__generated__/places.req.g
show GPlacesReq; show GPlacesReq;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/places.var.gql.dart' import 'package:mapflow/features/mapflow/data/graphql/__generated__/places.var.gql.dart'
show GPlacesVars; show GPlacesVars;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/recommend_places_by_voice.data.gql.dart'
show
GRecommendPlacesByVoiceData,
GRecommendPlacesByVoiceData_recommendPlacesByVoice,
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places,
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/recommend_places_by_voice.req.gql.dart'
show GRecommendPlacesByVoiceReq;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/recommend_places_by_voice.var.gql.dart'
show GRecommendPlacesByVoiceVars;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/remove_favorite_place.data.gql.dart' import 'package:mapflow/features/mapflow/data/graphql/__generated__/remove_favorite_place.data.gql.dart'
show show
GRemoveFavoritePlaceData, GRemoveFavoritePlaceData,
@@ -97,18 +107,8 @@ import 'package:mapflow/features/mapflow/data/graphql/__generated__/schema.schem
GAuthenticateTelegramLoginInput, GAuthenticateTelegramLoginInput,
GCreateVoiceExperienceInput, GCreateVoiceExperienceInput,
GNearbyPlacesInput, GNearbyPlacesInput,
GSearchPlacesInput, GVoiceExperienceStatus,
GVoiceExperienceStatus; GVoicePlaceRecommendationsInput;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/search_places.data.gql.dart'
show
GSearchPlacesData,
GSearchPlacesData_searchPlaces,
GSearchPlacesData_searchPlaces_places,
GSearchPlacesData_searchPlaces_places_experiences;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/search_places.req.gql.dart'
show GSearchPlacesReq;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/search_places.var.gql.dart'
show GSearchPlacesVars;
import 'package:mapflow/features/mapflow/data/graphql/__generated__/start_telegram_bot_login.data.gql.dart' import 'package:mapflow/features/mapflow/data/graphql/__generated__/start_telegram_bot_login.data.gql.dart'
show show
GStartTelegramBotLoginData, GStartTelegramBotLoginData,
@@ -181,18 +181,17 @@ final SerializersBuilder _serializersBuilder = _$serializers.toBuilder()
GPlacesData_places_experiences, GPlacesData_places_experiences,
GPlacesReq, GPlacesReq,
GPlacesVars, GPlacesVars,
GRecommendPlacesByVoiceData,
GRecommendPlacesByVoiceData_recommendPlacesByVoice,
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places,
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences,
GRecommendPlacesByVoiceReq,
GRecommendPlacesByVoiceVars,
GRemoveFavoritePlaceData, GRemoveFavoritePlaceData,
GRemoveFavoritePlaceData_removeFavoritePlace, GRemoveFavoritePlaceData_removeFavoritePlace,
GRemoveFavoritePlaceData_removeFavoritePlace_experiences, GRemoveFavoritePlaceData_removeFavoritePlace_experiences,
GRemoveFavoritePlaceReq, GRemoveFavoritePlaceReq,
GRemoveFavoritePlaceVars, GRemoveFavoritePlaceVars,
GSearchPlacesData,
GSearchPlacesData_searchPlaces,
GSearchPlacesData_searchPlaces_places,
GSearchPlacesData_searchPlaces_places_experiences,
GSearchPlacesInput,
GSearchPlacesReq,
GSearchPlacesVars,
GStartTelegramBotLoginData, GStartTelegramBotLoginData,
GStartTelegramBotLoginData_startTelegramBotLogin, GStartTelegramBotLoginData_startTelegramBotLogin,
GStartTelegramBotLoginReq, GStartTelegramBotLoginReq,
@@ -204,5 +203,6 @@ final SerializersBuilder _serializersBuilder = _$serializers.toBuilder()
GVoiceExperiencesData_voiceExperiences_user, GVoiceExperiencesData_voiceExperiences_user,
GVoiceExperiencesReq, GVoiceExperiencesReq,
GVoiceExperiencesVars, GVoiceExperiencesVars,
GVoicePlaceRecommendationsInput,
]) ])
final Serializers serializers = _serializersBuilder.build(); final Serializers serializers = _serializersBuilder.build();
@@ -66,6 +66,18 @@ Serializers _$serializers =
..add(GPlacesData_places_experiences.serializer) ..add(GPlacesData_places_experiences.serializer)
..add(GPlacesReq.serializer) ..add(GPlacesReq.serializer)
..add(GPlacesVars.serializer) ..add(GPlacesVars.serializer)
..add(GRecommendPlacesByVoiceData.serializer)
..add(GRecommendPlacesByVoiceData_recommendPlacesByVoice.serializer)
..add(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places
.serializer,
)
..add(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences
.serializer,
)
..add(GRecommendPlacesByVoiceReq.serializer)
..add(GRecommendPlacesByVoiceVars.serializer)
..add(GRemoveFavoritePlaceData.serializer) ..add(GRemoveFavoritePlaceData.serializer)
..add(GRemoveFavoritePlaceData_removeFavoritePlace.serializer) ..add(GRemoveFavoritePlaceData_removeFavoritePlace.serializer)
..add( ..add(
@@ -73,13 +85,6 @@ Serializers _$serializers =
) )
..add(GRemoveFavoritePlaceReq.serializer) ..add(GRemoveFavoritePlaceReq.serializer)
..add(GRemoveFavoritePlaceVars.serializer) ..add(GRemoveFavoritePlaceVars.serializer)
..add(GSearchPlacesData.serializer)
..add(GSearchPlacesData_searchPlaces.serializer)
..add(GSearchPlacesData_searchPlaces_places.serializer)
..add(GSearchPlacesData_searchPlaces_places_experiences.serializer)
..add(GSearchPlacesInput.serializer)
..add(GSearchPlacesReq.serializer)
..add(GSearchPlacesVars.serializer)
..add(GStartTelegramBotLoginData.serializer) ..add(GStartTelegramBotLoginData.serializer)
..add(GStartTelegramBotLoginData_startTelegramBotLogin.serializer) ..add(GStartTelegramBotLoginData_startTelegramBotLogin.serializer)
..add(GStartTelegramBotLoginReq.serializer) ..add(GStartTelegramBotLoginReq.serializer)
@@ -91,6 +96,7 @@ Serializers _$serializers =
..add(GVoiceExperiencesData_voiceExperiences_user.serializer) ..add(GVoiceExperiencesData_voiceExperiences_user.serializer)
..add(GVoiceExperiencesReq.serializer) ..add(GVoiceExperiencesReq.serializer)
..add(GVoiceExperiencesVars.serializer) ..add(GVoiceExperiencesVars.serializer)
..add(GVoicePlaceRecommendationsInput.serializer)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [ const FullType(BuiltList, const [
const FullType(GFavoritePlacesData_favoritePlaces), const FullType(GFavoritePlacesData_favoritePlaces),
@@ -109,12 +115,6 @@ Serializers _$serializers =
]), ]),
() => ListBuilder<GPlacesData_places>(), () => ListBuilder<GPlacesData_places>(),
) )
..addBuilderFactory(
const FullType(BuiltList, const [
const FullType(GSearchPlacesData_searchPlaces_places),
]),
() => ListBuilder<GSearchPlacesData_searchPlaces_places>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [ const FullType(BuiltList, const [
const FullType(GVoiceExperiencesData_voiceExperiences), const FullType(GVoiceExperiencesData_voiceExperiences),
@@ -129,6 +129,21 @@ Serializers _$serializers =
const FullType(BuiltList, const [const FullType(String)]), const FullType(BuiltList, const [const FullType(String)]),
() => ListBuilder<String>(), () => ListBuilder<String>(),
) )
..addBuilderFactory(
const FullType(BuiltList, const [
const FullType(
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places,
),
]),
() =>
ListBuilder<
GRecommendPlacesByVoiceData_recommendPlacesByVoice_places
>(),
)
..addBuilderFactory(
const FullType(BuiltList, const [const FullType(String)]),
() => ListBuilder<String>(),
)
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [const FullType(String)]), const FullType(BuiltList, const [const FullType(String)]),
() => ListBuilder<String>(), () => ListBuilder<String>(),
@@ -225,12 +240,12 @@ Serializers _$serializers =
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [ const FullType(BuiltList, const [
const FullType( const FullType(
GRemoveFavoritePlaceData_removeFavoritePlace_experiences, GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences,
), ),
]), ]),
() => () =>
ListBuilder< ListBuilder<
GRemoveFavoritePlaceData_removeFavoritePlace_experiences GRecommendPlacesByVoiceData_recommendPlacesByVoice_places_experiences
>(), >(),
) )
..addBuilderFactory( ..addBuilderFactory(
@@ -247,11 +262,13 @@ Serializers _$serializers =
) )
..addBuilderFactory( ..addBuilderFactory(
const FullType(BuiltList, const [ const FullType(BuiltList, const [
const FullType(GSearchPlacesData_searchPlaces_places_experiences), const FullType(
GRemoveFavoritePlaceData_removeFavoritePlace_experiences,
),
]), ]),
() => () =>
ListBuilder< ListBuilder<
GSearchPlacesData_searchPlaces_places_experiences GRemoveFavoritePlaceData_removeFavoritePlace_experiences
>(), >(),
)) ))
.build(); .build();
@@ -1,6 +1,8 @@
query SearchPlaces($input: SearchPlacesInput!) { mutation RecommendPlacesByVoice($input: VoicePlaceRecommendationsInput!) {
searchPlaces(input: $input) { recommendPlacesByVoice(input: $input) {
message transcript
tags
summary
places { places {
id id
googlePlaceId googlePlaceId
@@ -10,8 +10,8 @@ import 'graphql/__generated__/favorite_places.data.gql.dart';
import 'graphql/__generated__/me.data.gql.dart'; import 'graphql/__generated__/me.data.gql.dart';
import 'graphql/__generated__/nearby_places.data.gql.dart'; import 'graphql/__generated__/nearby_places.data.gql.dart';
import 'graphql/__generated__/places.data.gql.dart'; import 'graphql/__generated__/places.data.gql.dart';
import 'graphql/__generated__/recommend_places_by_voice.data.gql.dart';
import 'graphql/__generated__/remove_favorite_place.data.gql.dart'; import 'graphql/__generated__/remove_favorite_place.data.gql.dart';
import 'graphql/__generated__/search_places.data.gql.dart';
import 'graphql/__generated__/voice_experiences.data.gql.dart'; import 'graphql/__generated__/voice_experiences.data.gql.dart';
AppUser appUserFromMe(GMeData_me user) { AppUser appUserFromMe(GMeData_me user) {
@@ -158,8 +158,8 @@ PlaceRecommendation placeRecommendationFromFavoritePlace(
); );
} }
PlaceRecommendation placeRecommendationFromSearchPlace( PlaceRecommendation placeRecommendationFromVoiceRecommendedPlace(
GSearchPlacesData_searchPlaces_places place, GRecommendPlacesByVoiceData_recommendPlacesByVoice_places place,
) { ) {
return PlaceRecommendation( return PlaceRecommendation(
id: place.id, id: place.id,
@@ -5,8 +5,8 @@ import 'graphql/__generated__/add_favorite_place.req.gql.dart';
import 'graphql/__generated__/favorite_places.req.gql.dart'; import 'graphql/__generated__/favorite_places.req.gql.dart';
import 'graphql/__generated__/nearby_places.req.gql.dart'; import 'graphql/__generated__/nearby_places.req.gql.dart';
import 'graphql/__generated__/places.req.gql.dart'; import 'graphql/__generated__/places.req.gql.dart';
import 'graphql/__generated__/recommend_places_by_voice.req.gql.dart';
import 'graphql/__generated__/remove_favorite_place.req.gql.dart'; import 'graphql/__generated__/remove_favorite_place.req.gql.dart';
import 'graphql/__generated__/search_places.req.gql.dart';
import 'mapflow_data_mappers.dart'; import 'mapflow_data_mappers.dart';
import 'mapflow_graphql_client.dart'; import 'mapflow_graphql_client.dart';
@@ -43,16 +43,23 @@ class PlacesRepository {
return data.nearbyPlaces.map(placeRecommendationFromNearbyPlace).toList(); return data.nearbyPlaces.map(placeRecommendationFromNearbyPlace).toList();
} }
Future<PlaceSearchResult> searchPlaces(String query) async { Future<VoicePlaceRecommendationResult> recommendPlacesByVoice({
required String audioContentBase64,
required String audioMimeType,
}) async {
final data = await _client.request( final data = await _client.request(
GSearchPlacesReq((b) { GRecommendPlacesByVoiceReq((b) {
b.vars.input.query = query; b.vars.input
..audioContentBase64 = audioContentBase64
..audioMimeType = audioMimeType;
}), }),
); );
return PlaceSearchResult( return VoicePlaceRecommendationResult(
message: data.searchPlaces.message, transcript: data.recommendPlacesByVoice.transcript,
places: data.searchPlaces.places tags: data.recommendPlacesByVoice.tags.toList().cast<String>(),
.map(placeRecommendationFromSearchPlace) summary: data.recommendPlacesByVoice.summary,
places: data.recommendPlacesByVoice.places
.map(placeRecommendationFromVoiceRecommendedPlace)
.toList(), .toList(),
); );
} }
+10 -3
View File
@@ -186,10 +186,17 @@ class PlaceRecommendation {
} }
} }
class PlaceSearchResult { class VoicePlaceRecommendationResult {
const PlaceSearchResult({required this.message, required this.places}); const VoicePlaceRecommendationResult({
required this.transcript,
required this.tags,
required this.summary,
required this.places,
});
final String message; final String transcript;
final List<String> tags;
final String summary;
final List<PlaceRecommendation> places; final List<PlaceRecommendation> places;
} }
@@ -125,12 +125,12 @@ class _MapContent extends StatelessWidget {
SafeArea( SafeArea(
child: Align( child: Align(
alignment: Alignment.topCenter, alignment: Alignment.topCenter,
child: _MapSearchButton( child: _VoiceFilterButton(
query: state.searchQuery, transcript: state.voiceFilterTranscript,
onSearch: placeCubit.searchPlaces, onApply: placeCubit.recommendPlacesByVoice,
onClear: state.searchQuery.isEmpty onClear: state.voiceFilterTranscript.isEmpty
? null ? null
: placeCubit.clearSearch, : placeCubit.clearVoiceFilter,
), ),
), ),
), ),
@@ -334,21 +334,25 @@ class _AddReviewButton extends StatelessWidget {
} }
} }
class _MapSearchButton extends StatelessWidget { class _VoiceFilterButton extends StatelessWidget {
const _MapSearchButton({ const _VoiceFilterButton({
required this.query, required this.transcript,
required this.onSearch, required this.onApply,
required this.onClear, required this.onClear,
}); });
final String query; final String transcript;
final Future<void> Function(String) onSearch; final Future<void> Function({
required String audioContentBase64,
required String audioMimeType,
})
onApply;
final Future<void> Function()? onClear; final Future<void> Function()? onClear;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final tokens = context.mapflowTokens; final tokens = context.mapflowTokens;
final label = query.isEmpty ? 'Поиск' : query; final label = transcript.isEmpty ? 'Голосом' : transcript;
return Padding( return Padding(
padding: const EdgeInsets.only(top: 8, left: 70, right: 70), padding: const EdgeInsets.only(top: 8, left: 70, right: 70),
@@ -364,7 +368,7 @@ class _MapSearchButton extends StatelessWidget {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
children: [ children: [
const SizedBox(width: 12), const SizedBox(width: 12),
const Icon(Icons.auto_awesome_outlined, size: 18), const Icon(Icons.mic_none_rounded, size: 18),
const SizedBox(width: 8), const SizedBox(width: 8),
Flexible( Flexible(
child: Text( child: Text(
@@ -392,40 +396,141 @@ class _MapSearchButton extends StatelessWidget {
} }
Future<void> _openSearch(BuildContext context) async { Future<void> _openSearch(BuildContext context) async {
final controller = TextEditingController(text: query); final result = await showDialog<_VoiceFilterAudio>(
final result = await showDialog<String>(
context: context, context: context,
builder: (context) { builder: (_) => const _VoiceFilterDialog(),
return AlertDialog(
contentPadding: const EdgeInsets.fromLTRB(18, 18, 18, 8),
content: TextField(
controller: controller,
autofocus: true,
textInputAction: TextInputAction.search,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.auto_awesome_outlined),
hintText: 'Что ищем?',
),
onSubmitted: (value) => Navigator.of(context).pop(value),
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Отмена'),
),
FilledButton(
onPressed: () => Navigator.of(context).pop(controller.text),
child: const Text('Найти'),
),
],
);
},
); );
controller.dispose();
if (result == null) { if (result == null) {
return; return;
} }
await onSearch(result); await onApply(
audioContentBase64: result.audioContentBase64,
audioMimeType: result.audioMimeType,
);
}
}
class _VoiceFilterAudio {
const _VoiceFilterAudio({
required this.audioContentBase64,
required this.audioMimeType,
});
final String audioContentBase64;
final String audioMimeType;
}
class _VoiceFilterDialog extends StatefulWidget {
const _VoiceFilterDialog();
@override
State<_VoiceFilterDialog> createState() => _VoiceFilterDialogState();
}
class _VoiceFilterDialogState extends State<_VoiceFilterDialog> {
final _waveController = WaveformRecorderController(
interval: const Duration(milliseconds: 60),
config: const RecordConfig(
numChannels: 1,
sampleRate: 44100,
autoGain: true,
echoCancel: true,
noiseSuppress: true,
),
);
var _recording = false;
var _submitting = false;
var _hasRecording = false;
@override
void dispose() {
_waveController.dispose();
super.dispose();
}
Future<void> _toggleRecording() async {
if (_recording) {
await _waveController.stopRecording();
setState(() {
_recording = false;
_hasRecording = true;
});
return;
}
await _waveController.startRecording();
setState(() => _recording = true);
}
Future<void> _apply() async {
if (_recording) {
await _waveController.stopRecording();
setState(() {
_recording = false;
_hasRecording = true;
});
}
final file = _waveController.file;
if (file == null) {
throw StateError('Voice filter recording file is required.');
}
setState(() => _submitting = true);
final bytes = await file.readAsBytes();
if (!mounted) {
return;
}
Navigator.of(context).pop(
_VoiceFilterAudio(
audioContentBase64: base64Encode(bytes),
audioMimeType: file.mimeType ?? 'audio/wav',
),
);
}
@override
Widget build(BuildContext context) {
return AlertDialog(
contentPadding: const EdgeInsets.fromLTRB(18, 18, 18, 8),
content: SizedBox(
width: 260,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
IconButton.filled(
onPressed: _submitting ? null : _toggleRecording,
icon: Icon(_recording ? Icons.stop_rounded : Icons.mic_rounded),
iconSize: 34,
style: IconButton.styleFrom(
fixedSize: const Size.square(82),
minimumSize: const Size.square(82),
),
tooltip: _recording ? 'Стоп' : 'Записать',
),
const SizedBox(height: 16),
Text(
_recording ? 'Слушаю' : 'Голосовой фильтр',
style: const TextStyle(fontWeight: FontWeight.w900),
),
],
),
),
actions: [
TextButton(
onPressed: _submitting ? null : () => Navigator.of(context).pop(),
child: const Text('Отмена'),
),
FilledButton(
onPressed: _submitting || !_hasRecording ? null : _apply,
child: _submitting
? const SizedBox.square(
dimension: 18,
child: CircularProgressIndicator(strokeWidth: 2),
)
: const Text('Применить'),
),
],
);
} }
} }