mirror of
https://github.com/immich-app/immich.git
synced 2024-11-18 03:19:01 -07:00
e5459b68ff
Implemented a mechanism to extract the correct time zone from the GPS coordinate if presented in the file's EXIF, and to convert the timestamp to the correct UTC time so that the time will show correctly based on the mobile/web local time zone.
110 lines
3.9 KiB
Dart
110 lines
3.9 KiB
Dart
import 'package:easy_localization/easy_localization.dart';
|
|
import 'package:flutter/material.dart';
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
|
import 'package:immich_mobile/modules/home/providers/home_page_state.provider.dart';
|
|
import 'package:openapi/api.dart';
|
|
|
|
class DailyTitleText extends ConsumerWidget {
|
|
const DailyTitleText({
|
|
Key? key,
|
|
required this.isoDate,
|
|
required this.assetGroup,
|
|
}) : super(key: key);
|
|
|
|
final String isoDate;
|
|
final List<AssetResponseDto> assetGroup;
|
|
|
|
@override
|
|
Widget build(BuildContext context, WidgetRef ref) {
|
|
var currentYear = DateTime.now().year;
|
|
var groupYear = DateTime.parse(isoDate).year;
|
|
var formatDateTemplate = currentYear == groupYear
|
|
? "daily_title_text_date".tr()
|
|
: "daily_title_text_date_year".tr();
|
|
var dateText = DateFormat(formatDateTemplate)
|
|
.format(DateTime.parse(isoDate).toLocal());
|
|
var isMultiSelectEnable =
|
|
ref.watch(homePageStateProvider).isMultiSelectEnable;
|
|
var selectedDateGroup = ref.watch(homePageStateProvider).selectedDateGroup;
|
|
var selectedItems = ref.watch(homePageStateProvider).selectedItems;
|
|
|
|
void _handleTitleIconClick() {
|
|
if (isMultiSelectEnable &&
|
|
selectedDateGroup.contains(dateText) &&
|
|
selectedDateGroup.length == 1 &&
|
|
selectedItems.length <= assetGroup.length) {
|
|
// Multi select is active - click again on the icon while it is the only active group -> disable multi select
|
|
ref.watch(homePageStateProvider.notifier).disableMultiSelect();
|
|
} else if (isMultiSelectEnable &&
|
|
selectedDateGroup.contains(dateText) &&
|
|
selectedItems.length != assetGroup.length) {
|
|
// Multi select is active - click again on the icon while it is not the only active group -> remove that group from selected group/items
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.removeSelectedDateGroup(dateText);
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.removeMultipleSelectedItem(assetGroup);
|
|
} else if (isMultiSelectEnable &&
|
|
selectedDateGroup.contains(dateText) &&
|
|
selectedDateGroup.length > 1) {
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.removeSelectedDateGroup(dateText);
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.removeMultipleSelectedItem(assetGroup);
|
|
} else if (isMultiSelectEnable && !selectedDateGroup.contains(dateText)) {
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.addSelectedDateGroup(dateText);
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.addMultipleSelectedItems(assetGroup);
|
|
} else {
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.enableMultiSelect(assetGroup.toSet());
|
|
ref
|
|
.watch(homePageStateProvider.notifier)
|
|
.addSelectedDateGroup(dateText);
|
|
}
|
|
}
|
|
|
|
return SliverToBoxAdapter(
|
|
child: Padding(
|
|
padding: const EdgeInsets.only(
|
|
top: 29.0,
|
|
bottom: 29.0,
|
|
left: 12.0,
|
|
right: 12.0,
|
|
),
|
|
child: Row(
|
|
children: [
|
|
Text(
|
|
dateText,
|
|
style: const TextStyle(
|
|
fontSize: 14,
|
|
fontWeight: FontWeight.bold,
|
|
),
|
|
),
|
|
const Spacer(),
|
|
GestureDetector(
|
|
onTap: _handleTitleIconClick,
|
|
child: isMultiSelectEnable && selectedDateGroup.contains(dateText)
|
|
? Icon(
|
|
Icons.check_circle_rounded,
|
|
color: Theme.of(context).primaryColor,
|
|
)
|
|
: const Icon(
|
|
Icons.check_circle_outline_rounded,
|
|
color: Colors.grey,
|
|
),
|
|
)
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|