Feat/journey external picture provider rework (#1632)

* feat(journey): add contextual external photo browser

* fix(Journey) added missing language keys for new Journey feature

* fix(Journey) fixing missing gps requests aswell as added protection against duplicate entries
This commit is contained in:
SimMesg20
2026-07-23 21:35:12 +02:00
committed by GitHub
parent 8855b5581d
commit 4d3d16389e
35 changed files with 618 additions and 44 deletions
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.pdf.theEnd': 'The End', // en-fallback
'journey.pdf.saveAsPdf': 'Save as PDF', // en-fallback
'journey.pdf.pages': 'pages', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': "Vols eliminar {username} d'aquesta travesia?",
'journey.contributors.removed': 'Col·laborador eliminat',
'journey.contributors.removeFailed': "No s'ha pogut eliminar el col·laborador",
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.picker.selectDate': 'Datum wählen',
'journey.picker.search': 'Suchen',
'journey.detail.journeyTab': 'Journey', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -111,6 +111,13 @@ const journey: TranslationStrings = {
'journey.editor.uploadPartialFailed': '{failed} of {total} photos failed — save again to retry',
'journey.editor.fromGallery': 'From Gallery',
'journey.editor.allPhotosAdded': 'All photos already added',
'journey.editor.externalPhotos': 'External photos',
'journey.editor.externalPhotosFor': 'Photos for {date}',
'journey.editor.externalPhotosNearby': 'Nearby photos first',
'journey.editor.externalPhotosNoLocation': 'All photos from this day',
'journey.editor.externalPhotosQueued': 'queued',
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.',
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry',
'journey.editor.writeStory': 'Write your story...',
'journey.editor.prosCons': 'Pros & Cons',
'journey.editor.pros': 'Pros',
@@ -217,6 +224,7 @@ const journey: TranslationStrings = {
'journey.pdf.saveAsPdf': 'Save as PDF',
'journey.pdf.pages': 'pages',
'journey.picker.tripPeriod': 'Trip Period',
'journey.picker.day': 'This day',
'journey.picker.dateRange': 'Date Range',
'journey.picker.allPhotos': 'All Photos',
'journey.picker.albums': 'Albums',
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -229,5 +229,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -230,5 +230,13 @@ const journey: TranslationStrings = {
'journey.picker.noAlbums': 'Δεν βρέθηκαν άλμπουμ',
'journey.picker.selectDate': 'Επιλογή ημερομηνίας',
'journey.picker.search': 'Αναζήτηση',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -229,5 +229,13 @@ const journey: TranslationStrings = {
'journey.editor.uploadPartialFailed':
'{total}枚中{failed}枚の写真がアップロードに失敗しました — もう一度保存して再試行してください',
'journey.photosUploadFailed': '一部の写真をアップロードできませんでした',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -229,5 +229,13 @@ const journey: TranslationStrings = {
'journey.editor.uploadPartialFailed':
'{total}개 중 {failed}개의 사진을 업로드하지 못했습니다 — 다시 저장하여 재시도하세요',
'journey.photosUploadFailed': '일부 사진을 업로드하지 못했습니다',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -229,5 +229,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.picker.noAlbums': 'Inga album hittades',
'journey.picker.selectDate': 'Välj datum',
'journey.picker.search': 'Sök',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.editor.uploadFailed': 'Fotoğraf yüklenemedi',
'journey.editor.uploadPartialFailed': '{total} fotoğraftan {failed} tanesi başarısız — tekrar denemek için kaydedin',
'journey.photosUploadFailed': 'Bazı fotoğraflar yüklenemedi',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -229,5 +229,13 @@ const journey: TranslationStrings = {
'journey.editor.uploadPartialFailed':
'{failed} з {total} фото не вдалося завантажити — збережіть ще раз, щоб повторити',
'journey.photosUploadFailed': 'Деякі фото не вдалося завантажити',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -228,5 +228,13 @@ const journey: TranslationStrings = {
'journey.picker.noAlbums': 'Không tìm thấy album nào',
'journey.picker.selectDate': 'Chọn ngày',
'journey.picker.search': 'Tìm kiếm',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -227,5 +227,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': 'Remove {username} from this journey?', // en-fallback
'journey.contributors.removed': 'Contributor removed', // en-fallback
'journey.contributors.removeFailed': 'Failed to remove contributor', // en-fallback
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;
+8
View File
@@ -227,5 +227,13 @@ const journey: TranslationStrings = {
'journey.contributors.removeConfirm': '要将 {username} 从此旅程中移除吗?',
'journey.contributors.removed': '已移除贡献者',
'journey.contributors.removeFailed': '移除贡献者失败',
'journey.editor.externalPhotos': 'External photos', // en-fallback
'journey.editor.externalPhotosFor': 'Photos for {date}', // en-fallback
'journey.editor.externalPhotosNearby': 'Nearby photos first', // en-fallback
'journey.editor.externalPhotosNoLocation': 'All photos from this day', // en-fallback
'journey.editor.externalPhotosQueued': 'queued', // en-fallback
'journey.editor.externalPhotosUnavailable': 'No connected photo providers are available.', // en-fallback
'journey.editor.externalPhotosPartialFailed': '{failed} photo groups failed — save again to retry', // en-fallback
'journey.picker.day': 'This day', // en-fallback
};
export default journey;