Compare commits

...

4 Commits

Author SHA1 Message Date
renovate[bot] 439ace9dba chore(deps): update ghcr.io/jdx/mise docker tag to v2026.7.2 (#29678) 2026-07-08 13:22:06 +02:00
Ben Beckford 5c2fb2245a feat(server): date workflow filter (#29040) 2026-07-08 12:05:44 +02:00
shenlong 924e6251fd fix: do not log out on automatic url switch (#29715)
fix: sync headers to external endpoints

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
2026-07-07 21:21:37 -05:00
Mert 3aebb82905 fix(mobile): http request handling after isolate death (#29714)
* use ports for objc

* add task reaper

* cleanup, fewer allocations

* link to pr
2026-07-07 16:31:10 -04:00
8 changed files with 139 additions and 13 deletions
+1
View File
@@ -183,6 +183,7 @@ class AuthNotifier extends StateNotifier<AuthState> {
Future<void> saveLocalEndpoint(String url) async { Future<void> saveLocalEndpoint(String url) async {
await _ref.read(settingsProvider).write(.networkLocalEndpoint, url); await _ref.read(settingsProvider).write(.networkLocalEndpoint, url);
await _apiService.updateHeaders();
} }
String? getSavedWifiName() { String? getSavedWifiName() {
@@ -5,6 +5,7 @@ import 'package:immich_mobile/domain/models/settings_key.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart';
import 'package:immich_mobile/models/auth/auxilary_endpoint.model.dart'; import 'package:immich_mobile/models/auth/auxilary_endpoint.model.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/providers/infrastructure/settings.provider.dart'; import 'package:immich_mobile/providers/infrastructure/settings.provider.dart';
import 'package:immich_mobile/widgets/settings/networking_settings/endpoint_input.dart'; import 'package:immich_mobile/widgets/settings/networking_settings/endpoint_input.dart';
@@ -26,13 +27,16 @@ class ExternalNetworkPreference extends HookConsumerWidget {
.map((e) => e.url) .map((e) => e.url)
.toList(); .toList();
ref.read(settingsProvider).write(SettingsKey.networkExternalEndpointList, urls); return ref.read(settingsProvider).write(SettingsKey.networkExternalEndpointList, urls);
} }
updateValidationStatus(String url, int index, AuxCheckStatus status) { updateValidationStatus(String url, int index, AuxCheckStatus status) async {
entries.value[index] = entries.value[index].copyWith(url: url, status: status); entries.value[index] = entries.value[index].copyWith(url: url, status: status);
saveEndpointList(); await saveEndpointList();
if (status == AuxCheckStatus.valid) {
await ref.read(apiServiceProvider).updateHeaders();
}
} }
handleReorder(int oldIndex, int newIndex) { handleReorder(int oldIndex, int newIndex) {
+8 -7
View File
@@ -309,8 +309,8 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "pkgs/cupertino_http" path: "pkgs/cupertino_http"
ref: a0a933358517c6d01cff37fc2a2752ee2d744a3c ref: "58b03c756b81d16b3975a8ae4b91d25360123bb5"
resolved-ref: a0a933358517c6d01cff37fc2a2752ee2d744a3c resolved-ref: "58b03c756b81d16b3975a8ae4b91d25360123bb5"
url: "https://github.com/mertalev/http" url: "https://github.com/mertalev/http"
source: git source: git
version: "3.0.0-wip" version: "3.0.0-wip"
@@ -1158,12 +1158,13 @@ packages:
source: hosted source: hosted
version: "0.5.0" version: "0.5.0"
objective_c: objective_c:
dependency: transitive dependency: "direct overridden"
description: description:
name: objective_c path: "pkgs/objective_c"
sha256: "6cb691c686fa2838c6deb34980d426145c2a5d537491cb83d463c33cdbc726ed" ref: "2915556701f4734a784222f290a82adb1b101682"
url: "https://pub.dev" resolved-ref: "2915556701f4734a784222f290a82adb1b101682"
source: hosted url: "https://github.com/mertalev/native"
source: git
version: "9.4.1" version: "9.4.1"
octo_image: octo_image:
dependency: "direct main" dependency: "direct main"
+6 -1
View File
@@ -84,7 +84,7 @@ dependencies:
cupertino_http: cupertino_http:
git: git:
url: https://github.com/mertalev/http url: https://github.com/mertalev/http
ref: 'a0a933358517c6d01cff37fc2a2752ee2d744a3c' # https://github.com/dart-lang/http/pull/1876 ref: '58b03c756b81d16b3975a8ae4b91d25360123bb5'
path: pkgs/cupertino_http/ path: pkgs/cupertino_http/
ok_http: ok_http:
git: git:
@@ -114,6 +114,11 @@ dev_dependencies:
# Pin bonsoir to 5.x until cast releases a version compatible with bonsoir 6.x. # Pin bonsoir to 5.x until cast releases a version compatible with bonsoir 6.x.
dependency_overrides: dependency_overrides:
bonsoir: ^5.1.11 bonsoir: ^5.1.11
objective_c:
git:
url: https://github.com/mertalev/native
ref: '2915556701f4734a784222f290a82adb1b101682' # https://github.com/dart-lang/native/pull/3458
path: pkgs/objective_c/
flutter: flutter:
uses-material-design: true uses-material-design: true
+92
View File
@@ -183,6 +183,98 @@
}, },
"uiHints": ["Filter"] "uiHints": ["Filter"]
}, },
{
"name": "assetDateFilter",
"title": "Filter by date",
"description": "Filter assets by date taken",
"types": ["AssetV1"],
"schema": {
"type": "object",
"properties": {
"startDate": {
"type": "object",
"title": "Start date",
"description": "Earliest date of assets to include",
"properties": {
"day": {
"type": "number",
"title": "Day",
"description": "Day of the year to match",
"uiHint": {
"order": 1
}
},
"month": {
"type": "number",
"title": "Month",
"description": "Month of the year to match",
"uiHint": {
"order": 2
}
},
"year": {
"type": "number",
"title": "Year",
"description": "Year to match",
"uiHint": {
"order": 3
}
}
},
"uiHint": {
"order": 1
},
"required": ["day", "month", "year"]
},
"endDate": {
"type": "object",
"title": "End date",
"description": "Latest date of assets to include",
"properties": {
"day": {
"type": "number",
"title": "Day",
"description": "Day of the year to match",
"uiHint": {
"order": 1
}
},
"month": {
"type": "number",
"title": "Month",
"description": "Month of the year to match",
"uiHint": {
"order": 2
}
},
"year": {
"type": "number",
"title": "Year",
"description": "Year to match",
"uiHint": {
"order": 3
}
}
},
"uiHint": {
"order": 2
},
"required": ["day", "month", "year"]
},
"recurring": {
"type": "boolean",
"default": false,
"title": "Match recurring dates",
"description": "Allow any assets with matching months/days regardless of the year",
"uiHint": {
"order": 3
}
}
},
"required": ["recurring", "startDate", "endDate"]
},
"uiHints": ["Filter"]
},
{ {
"name": "assetTypeFilter", "name": "assetTypeFilter",
"title": "Filter by asset type", "title": "Filter by asset type",
+23
View File
@@ -124,6 +124,27 @@ const methods = wrapper<Manifest>({
return { workflow: { continue: earthDiameter * delta <= (config.coordinate?.radius ?? 0) } }; return { workflow: { continue: earthDiameter * delta <= (config.coordinate?.radius ?? 0) } };
}, },
assetDateFilter: ({ config, data }) => {
const assetDate = new Date(data.asset.localDateTime);
let startDate = new Date(config.startDate.year, config.startDate.month - 1, config.startDate.day);
let endDate = new Date(config.endDate.year, config.endDate.month - 1, config.endDate.day);
if (config.recurring) {
startDate.setFullYear(assetDate.getFullYear());
endDate.setFullYear(assetDate.getFullYear());
if (endDate < startDate) {
if (assetDate > endDate) {
endDate.setFullYear(endDate.getFullYear() + 1);
} else {
startDate.setFullYear(startDate.getFullYear() - 1);
}
}
}
return { workflow: { continue: assetDate >= startDate && assetDate <= endDate } };
},
assetLock: ({ config, data }) => { assetLock: ({ config, data }) => {
if (!config.inverse && data.asset.visibility !== AssetVisibility.Locked) { if (!config.inverse && data.asset.visibility !== AssetVisibility.Locked) {
return { changes: { asset: { visibility: AssetVisibility.Locked } } }; return { changes: { asset: { visibility: AssetVisibility.Locked } } };
@@ -179,6 +200,7 @@ const {
assetFavorite, assetFavorite,
assetFileFilter, assetFileFilter,
assetLocationFilter, assetLocationFilter,
assetDateFilter,
assetLock, assetLock,
assetMissingTimeZoneFilter, assetMissingTimeZoneFilter,
assetTypeFilter, assetTypeFilter,
@@ -195,6 +217,7 @@ export {
assetFavorite, assetFavorite,
assetFileFilter, assetFileFilter,
assetLocationFilter, assetLocationFilter,
assetDateFilter,
assetLock, assetLock,
assetMissingTimeZoneFilter, assetMissingTimeZoneFilter,
assetTypeFilter, assetTypeFilter,
+1 -1
View File
@@ -56,7 +56,7 @@ FROM builder AS plugins
ARG TARGETPLATFORM ARG TARGETPLATFORM
COPY --from=ghcr.io/jdx/mise:2026.6.14@sha256:b8f8c20fc3308f8b1d00ccca2bc968e4e208af1c5c1069e1ad9753baa099acff /usr/local/bin/mise /usr/local/bin/mise COPY --from=ghcr.io/jdx/mise:2026.7.2@sha256:51d92371cc08e3c4f0e52f58bb3ec1975a6dc966b7430a4da37dcfc6ae772f30 /usr/local/bin/mise /usr/local/bin/mise
WORKDIR /app WORKDIR /app
COPY ./mise.toml ./mise.toml COPY ./mise.toml ./mise.toml
+1 -1
View File
@@ -2,7 +2,7 @@
FROM ghcr.io/immich-app/base-server-dev:202607061334@sha256:c83ef9c6d7f5e7f6a276fe96647484d46b7bf6cacc1e35b823dd1d7a1aeda3b8 AS dev FROM ghcr.io/immich-app/base-server-dev:202607061334@sha256:c83ef9c6d7f5e7f6a276fe96647484d46b7bf6cacc1e35b823dd1d7a1aeda3b8 AS dev
COPY --from=ghcr.io/jdx/mise:2026.6.14@sha256:b8f8c20fc3308f8b1d00ccca2bc968e4e208af1c5c1069e1ad9753baa099acff /usr/local/bin/mise /usr/local/bin/mise COPY --from=ghcr.io/jdx/mise:2026.7.2@sha256:51d92371cc08e3c4f0e52f58bb3ec1975a6dc966b7430a4da37dcfc6ae772f30 /usr/local/bin/mise /usr/local/bin/mise
RUN echo "devdir=/buildcache/node-gyp" >> /usr/local/etc/npmrc && \ RUN echo "devdir=/buildcache/node-gyp" >> /usr/local/etc/npmrc && \
echo "store-dir=/buildcache/pnpm-store" >> /usr/local/etc/npmrc && \ echo "store-dir=/buildcache/pnpm-store" >> /usr/local/etc/npmrc && \