Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Digital Guide structure tab #538

Open
wants to merge 15 commits into
base: main
Choose a base branch
from
2 changes: 2 additions & 0 deletions lib/config/nav_bar_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ extension IsRouteATabViewX on PageRouteInfo<dynamic> {
ScienceClubDetailRoute.name => context.localize.scientific_cirlces,
GuideDetailRoute.name => context.localize.guide,
DigitalGuideRoute.name => context.localize.digital_guide,
LevelRoute.name => context.localize.level,
RegionRoute.name => context.localize.region,
_ => null,
};
}
Expand Down
2 changes: 2 additions & 0 deletions lib/config/ui_config.dart
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,8 @@ abstract class DigitalGuideConfig {
static const paddingBig = 24.0;
static const difficultiesCardIconSize = 35.0;
static const photoRowHeight = 75.0;
static const bodyFont = 16.0;
static const headlineFont = 22.0;

// Basically there are 4 levels of accessability, but 0 and 1 are shown as the same on digital guide site
static const accessibilityLevelColors = [
Expand Down
1 change: 1 addition & 0 deletions lib/features/digital_guide_view/data/models/level.dart
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class LevelTranslations with _$LevelTranslations {
class LevelTranslation with _$LevelTranslation {
const factory LevelTranslation({
required String name,
@JsonKey(name: "room_numbers_range") required String roomNumbersRange,
}) = _LevelTranslation;

factory LevelTranslation.fromJson(Map<String, dynamic> json) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ extension HasAdaptedToiletsX on IList<LevelWithRegions> {
bool hasAdaptedToilets() {
for (final level in this) {
for (final region in level.regions) {
if (region.adaptedToiletsIndices.isNotEmpty) {
if (region.adaptedToilets.isNotEmpty) {
return true;
}
}
Expand Down
38 changes: 35 additions & 3 deletions lib/features/digital_guide_view/data/models/region.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,43 @@ part "region.g.dart";

@freezed
class Region with _$Region {
@JsonSerializable(fieldRename: FieldRename.snake)
const factory Region({
@JsonKey(name: "adapted_toilets") required List<int> adaptedToiletsIndices,
@JsonKey(name: "rooms") required List<int> roomsIds,
@JsonKey(name: "lifts") required List<int> liftsIds,
required RegionTranslations translations,
required List<int> dressingRooms,
required List<int> lodges,
required List<int> informationPoints,
required List<int> toilets,
required List<int> adaptedToilets,
required List<int> lifts,
required List<int> stairs,
required List<int> ramps,
required List<int> corridors,
required List<int> stairways,
required List<int> rooms,
required List<int> parkings,
}) = _Region;

factory Region.fromJson(Map<String, dynamic> json) => _$RegionFromJson(json);
}

@freezed
class RegionTranslations with _$RegionTranslations {
const factory RegionTranslations({
@JsonKey(name: "pl") required RegionTranslation plTranslation,
}) = _RegionTranslations;

factory RegionTranslations.fromJson(Map<String, dynamic> json) =>
_$RegionTranslationsFromJson(json);
}

@freezed
class RegionTranslation with _$RegionTranslation {
const factory RegionTranslation({
required String name,
required String location,
}) = _RegionTranslation;

factory RegionTranslation.fromJson(Map<String, dynamic> json) =>
_$RegionTranslationFromJson(json);
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import "../../tabs/localization/presentation/localization_expansion_tile_content
import "../../tabs/lodge/presentation/digital_guide_lodge_expansion_tile_content.dart";
import "../../tabs/micronavigation/presentation/micronavigation_expansion_tile_content.dart";
import "../../tabs/rooms/presentation/digital_guide_rooms_expansion_tile_content.dart";
import "../../tabs/structure/presentation/structure_expansion_tile_content.dart";
import "../../tabs/surrounding/presentation/surroundings_expansion_tile_content.dart";

typedef TileContent = ({String title, List<Widget> content});
Expand Down Expand Up @@ -99,7 +100,9 @@ class DigitalGuideFeaturesSection extends ConsumerWidget {
),
(
title: context.localize.building_structure,
content: [],
content: [
StructureExpansionTileContent(digitalGuideData: digitalGuideData),
],
),
(
title: context.localize.room_information,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Future<IList<AdaptedToilet>> adaptedToiletsRepository(
}

final adaptedToiletsIDs =
level.regions.expand((region) => region.adaptedToiletsIndices);
level.regions.expand((region) => region.adaptedToilets);
final toilets = await Future.wait(adaptedToiletsIDs.map(getAdaptedToilet));
return toilets.toIList();
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,14 @@ class AdaptedToiletDetailView extends ConsumerWidget {
context.localize.adapted_toilet_is_not_marked,
].lock,
),
const SizedBox(height: DigitalGuideConfig.heightBig),
if (adaptedToilet.doorsIndices.isNotEmpty)
const SizedBox(height: DigitalGuideConfig.heightMedium),
ListView.separated(
physics: const NeverScrollableScrollPhysics(),
itemBuilder: (context, index) {
return DigitalGuideNavLink(
onTap: () {},
text: context.localize.doors,
text: context.localize.door,
);
},
itemCount: adaptedToilet.doorsIndices.length,
Expand All @@ -79,11 +80,11 @@ class AdaptedToiletDetailView extends ConsumerWidget {
),
shrinkWrap: true,
),
const SizedBox(height: DigitalGuideConfig.heightBig),
const SizedBox(height: DigitalGuideConfig.heightMedium),
if (adaptedToilet.imagesIndices.isNotEmpty)
Text(
context.localize.images,
style: context.textTheme.title.copyWith(fontSize: 24),
style: context.textTheme.title.copyWith(fontSize: 22),
),
];

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,22 @@ Future<IList<DigitalGuideDressingRoom>> dressingRoomsRepository(
onRetry: () => ref.invalidateSelf(),
);
}

@riverpod
Future<IList<DigitalGuideDressingRoom>> dressingRoomsFromIDsRepository(
Ref ref,
List<int> dressingRoomsIDs,
) async {
Future<DigitalGuideDressingRoom> getDressingRoom(int dressingRoomID) async {
return ref.getAndCacheDataFromDigitalGuide(
"dressing_rooms/$dressingRoomID",
DigitalGuideDressingRoom.fromJson,
onRetry: () => ref.invalidateSelf(),
);
}

final dressingRooms =
await Future.wait(dressingRoomsIDs.map(getDressingRoom));

return dressingRooms.lock;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,18 +13,26 @@ part "lifts_repository.g.dart";
@riverpod
Future<IList<DigitalGuideLift>> liftsRepository(
Ref ref,
LevelWithRegions level,
List<int> liftIDs,
) async {
Future<DigitalGuideLift> getDigitalGuideLift(int liftId) async {
final endpoint = "lifts/$liftId";
Future<DigitalGuideLift> getLift(int liftID) async {
return ref.getAndCacheDataFromDigitalGuide(
endpoint,
"lifts/$liftID",
DigitalGuideLift.fromJson,
onRetry: () => ref.invalidateSelf(),
);
}

final liftsIds = level.regions.expand((region) => region.liftsIds);
final lifts = await Future.wait(liftsIds.map(getDigitalGuideLift));
return lifts.toIList();
final lifts = await Future.wait(liftIDs.map(getLift));

return lifts.lock;
}

@riverpod
Future<IList<DigitalGuideLift>> liftsFromLevelRepository(
Ref ref,
LevelWithRegions level,
) async {
final liftsIds = level.regions.expand((region) => region.lifts).toList();
return liftsRepository(ref, liftsIds);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@ Future<IList<LevelWithLifts>> getLevelWithLiftsUseCase(
.watch(levelsWithRegionsRepositoryProvider(digitalGuideData).future);
final levelsWithLiftsData = await Future.wait(
levels.map((level) async {
final lifts = await ref.watch(liftsRepositoryProvider(level).future);
final lifts =
await ref.watch(liftsFromLevelRepositoryProvider(level).future);
return (level: level.level, lifts: lifts);
}),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,21 @@ Future<IList<DigitalGuideLodge>> lodgesRepository(
onRetry: () => ref.invalidateSelf(),
);
}

@riverpod
Future<IList<DigitalGuideLodge>> lodgesFromIDsRepository(
Ref ref,
List<int> lodgesIDs,
) async {
Future<DigitalGuideLodge> getLodge(int lodgeID) async {
return ref.getAndCacheDataFromDigitalGuide(
"lodges/$lodgeID",
DigitalGuideLodge.fromJson,
onRetry: () => ref.invalidateSelf(),
);
}

final lodges = await Future.wait(lodgesIDs.map(getLodge));

return lodges.lock;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ Future<IList<DigitalGuideRoom>> roomsRepository(
);
}

final roomsIds = level.regions.expand((region) => region.roomsIds);
final roomsIds = level.regions.expand((region) => region.rooms);
final rooms = await Future.wait(roomsIds.map(getDigitalGuideRoom));
return rooms.toIList();
}
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ class DigitalGuideRoomDetailView extends ConsumerWidget {
),
DigitalGuideNavLink(
onTap: () {},
text: context.localize.doors,
text: context.localize.door,
),
const SizedBox(
height: DigitalGuideConfig.heightMedium,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:freezed_annotation/freezed_annotation.dart";

part "corridor.freezed.dart";
part "corridor.g.dart";

@freezed
class Corridor with _$Corridor {
@JsonSerializable(fieldRename: FieldRename.snake)
const factory Corridor({
required CorridorTranslations translations,
@JsonKey(fromJson: stringToBool) required bool isSimpleCorridorLayout,
@JsonKey(fromJson: stringToBool) required bool isFloorMarked,
@JsonKey(fromJson: stringToBool) required bool areRoomsEntrances,
@JsonKey(fromJson: stringToBool) required bool isInformationBoard,
@JsonKey(fromJson: stringToBool) required bool areRoomPurposeDescribedInEn,
@JsonKey(fromJson: stringToBool)
required bool isConsistentLevelColorPattern,
@JsonKey(fromJson: stringToBool) required bool arePictorialDirectionalSigns,
@JsonKey(fromJson: stringToBool) required bool areSeats,
@JsonKey(fromJson: stringToBool) required bool areVendingMachines,
@JsonKey(fromJson: stringToBool) required bool isEmergencyPlan,
@JsonKey(name: "doors") required IList<int> doorsIndices,
@JsonKey(name: "images") required IList<int> imagesIndices,
}) = _Corridor;

factory Corridor.fromJson(Map<String, dynamic> json) =>
_$CorridorFromJson(json);
}

@freezed
class CorridorTranslations with _$CorridorTranslations {
const factory CorridorTranslations({
@JsonKey(name: "pl") required CorridorTranslation plTranslation,
}) = _CorridorTranslations;

factory CorridorTranslations.fromJson(Map<String, dynamic> json) =>
_$CorridorTranslationsFromJson(json);
}

@freezed
class CorridorTranslation with _$CorridorTranslation {
@JsonSerializable(fieldRename: FieldRename.snake)
const factory CorridorTranslation({
required String name,
required String isSimpleCorridorLayoutComment,
required String isFloorMarkedComment,
required String areRoomsEntrancesComment,
required String isInformationBoardComment,
required String arePictorialDirectionalSignsComment,
required String areSeatsComment,
required String areVendingMachinesComment,
required String vendingMachinesProducts,
required String comment,
}) = _CorridorTranslation;

factory CorridorTranslation.fromJson(Map<String, dynamic> json) =>
_$CorridorTranslationFromJson(json);
}

bool stringToBool(String text) {
return text.toLowerCase() == "true";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

don't we have stringToBool somewhere else already?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We do in some other models I guess but where should we define it then? It cannot be an extension.

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import "package:freezed_annotation/freezed_annotation.dart";

part "information_point.g.dart";
part "information_point.freezed.dart";

@freezed
class InformationPoint with _$InformationPoint {
const factory InformationPoint({
required InformationPointTranslations translations,
}) = _InformationPoint;

factory InformationPoint.fromJson(Map<String, dynamic> json) =>
_$InformationPointFromJson(json);
}

@freezed
class InformationPointTranslations with _$InformationPointTranslations {
const factory InformationPointTranslations({
@JsonKey(name: "pl") required InformationPointTranslation plTranslation,
}) = _InformationPointTranslations;

factory InformationPointTranslations.fromJson(Map<String, dynamic> json) =>
_$InformationPointTranslationsFromJson(json);
}

@freezed
class InformationPointTranslation with _$InformationPointTranslation {
const factory InformationPointTranslation({
required String location,
}) = _InformationPointTranslation;

factory InformationPointTranslation.fromJson(Map<String, dynamic> json) =>
_$InformationPointTranslationFromJson(json);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import "package:freezed_annotation/freezed_annotation.dart";

part "parking.freezed.dart";
part "parking.g.dart";

@freezed
class Parking with _$Parking {
const factory Parking({
required ParkingTranslations translations,
}) = _Parking;

factory Parking.fromJson(Map<String, dynamic> json) =>
_$ParkingFromJson(json);
}

@freezed
class ParkingTranslations with _$ParkingTranslations {
const factory ParkingTranslations({
@JsonKey(name: "pl") required ParkingTranslation plTranslation,
}) = _ParkingTranslations;

factory ParkingTranslations.fromJson(Map<String, dynamic> json) =>
_$ParkingTranslationsFromJson(json);
}

@freezed
class ParkingTranslation with _$ParkingTranslation {
@JsonSerializable(fieldRename: FieldRename.snake)
const factory ParkingTranslation({
required String entryLocation,
}) = _ParkingTranslation;

factory ParkingTranslation.fromJson(Map<String, dynamic> json) =>
_$ParkingTranslationFromJson(json);
}
Loading