mirror of
https://github.com/immich-app/immich.git
synced 2025-01-04 02:46:47 +01:00
04f0e29df6
* fix(mobile): inconsistent thumbnail with label * fix: limit person's name width
62 lines
2.2 KiB
Dart
62 lines
2.2 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:immich_mobile/models/search/search_curated_content.model.dart';
|
|
import 'package:immich_mobile/widgets/search/search_map_thumbnail.dart';
|
|
import 'package:immich_mobile/widgets/search/thumbnail_with_info.dart';
|
|
import 'package:immich_mobile/entities/store.entity.dart';
|
|
|
|
class CuratedPlacesRow extends StatelessWidget {
|
|
const CuratedPlacesRow({
|
|
super.key,
|
|
required this.content,
|
|
required this.imageSize,
|
|
this.isMapEnabled = true,
|
|
this.onTap,
|
|
});
|
|
|
|
final bool isMapEnabled;
|
|
final List<SearchCuratedContent> content;
|
|
final double imageSize;
|
|
|
|
/// Callback with the content and the index when tapped
|
|
final Function(SearchCuratedContent, int)? onTap;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
// Calculating the actual index of the content based on the whether map is enabled or not.
|
|
// If enabled, inject map as the first item in the list (index 0) and so the actual content will start from index 1
|
|
final int actualContentIndex = isMapEnabled ? 1 : 0;
|
|
|
|
return SizedBox(
|
|
height: imageSize,
|
|
child: ListView.separated(
|
|
scrollDirection: Axis.horizontal,
|
|
padding: const EdgeInsets.symmetric(
|
|
horizontal: 16,
|
|
),
|
|
separatorBuilder: (context, index) => const SizedBox(width: 10),
|
|
itemBuilder: (context, index) {
|
|
// Injecting Map thumbnail as the first element
|
|
if (isMapEnabled && index == 0) {
|
|
return SizedBox.square(
|
|
dimension: imageSize,
|
|
child: SearchMapThumbnail(size: imageSize),
|
|
);
|
|
}
|
|
final actualIndex = index - actualContentIndex;
|
|
final object = content[actualIndex];
|
|
final thumbnailRequestUrl =
|
|
'${Store.get(StoreKey.serverEndpoint)}/assets/${object.id}/thumbnail';
|
|
return SizedBox.square(
|
|
dimension: imageSize,
|
|
child: ThumbnailWithInfo(
|
|
imageUrl: thumbnailRequestUrl,
|
|
textInfo: object.label,
|
|
onTap: () => onTap?.call(object, actualIndex),
|
|
),
|
|
);
|
|
},
|
|
itemCount: content.length + actualContentIndex,
|
|
),
|
|
);
|
|
}
|
|
}
|