diet-guard/app/lib/services/github_client_factory_io.dart
Krzysztof kuhy Rudnicki 7a491d9d91
Some checks are pending
pre-commit / pre-commit (push) Waiting to run
Tests / test (3.10) (push) Waiting to run
Tests / test (3.11) (push) Waiting to run
Tests / test (3.12) (push) Waiting to run
release-apk / release (APK) (push) Waiting to run
app: use the shared github_device_auth package
The inline `_DeviceCodeDialog` in `github_mirror_screen.dart` (88 lines)
was byte-for-byte identical to wake-alarm's, and
`services/github_device_auth.dart` was a fourth copy of the auth client.
Both now come from `github_device_auth` in the kuhyx/utils monorepo.

This app's copy was the one that mattered most to get right: it took the
device-code and token URLs as parameters because GitHub's device-flow
endpoints send no CORS headers, so the desktop **web** build has to route
both through the local wrapper (`github_client_factory_web.dart` passes
them). Extracting todo's simpler hardcoded version would have broken that
build outright. The package carries the configurable endpoints instead,
defaulting to GitHub's own URLs so the other three consumers are
unaffected -- and `flutter build web` here is verified green, which is the
check that would have caught it.

The dialog also gains a real fix: `on Object` rather than `on Exception`,
so an `ArgumentError` shows an error instead of leaving the dialog
spinning on "Waiting for authorization…" forever.

The unused `token_vault` import in the deleted client confirmed it had no
app-specific behaviour left worth keeping. 548 tests pass, analyze clean,
web build green, and the release APK is installed on the phone with meal
history intact.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01U4Rj3s7K2qzrLNgJqqPhno
2026-08-15 16:15:24 +02:00

35 lines
1.1 KiB
Dart

/// Direct GitHub client, used on Android.
library;
import 'package:crdt_sync/crdt_sync.dart';
import 'package:diet_guard_app/services/sync_settings.dart';
import 'package:github_device_auth/github_device_auth.dart';
import 'package:http/http.dart' as http;
/// This device's id in the `diet-guard-sync/devices/<id>/food_log.json`
/// layout.
///
/// The PC's Python side pushes under `pc` (`SYNC_DEVICE_ID` in
/// `diet_guard/_constants.py`) and the desktop web build under `desktop`;
/// every device must have its own, or two of them overwrite each other's
/// pushed log on every tick.
const syncDeviceId = 'phone';
/// Builds a client that talks to `api.github.com` directly with [settings]'
/// token.
GitHubClient createGitHubClient(
SyncSettings settings, {
http.Client? httpClient,
}) => GitHubClient(
owner: settings.owner,
repo: settings.repo,
token: settings.token,
httpClient: httpClient,
);
/// Builds the device-flow client, talking to GitHub directly.
GitHubDeviceAuth createDeviceAuth(
String clientId, {
http.Client? httpClient,
}) => GitHubDeviceAuth(clientId: clientId, httpClient: httpClient);