diff --git a/lib/api/client.dart b/lib/api/client.dart index beef9f4..e4ad511 100644 --- a/lib/api/client.dart +++ b/lib/api/client.dart @@ -257,6 +257,11 @@ abstract class _EHApi { @Query("tag") String? tag, @Query("category") String? category, @CancelRequest() CancelToken? cancel}); + @DELETE('/shared_token') + @MultiPart() + Future> deleteSharedToken( + @Part(name: "token") String token, @Part(name: "type") String type, + {@CancelRequest() CancelToken? cancel}); @PUT('/shared_token') @MultiPart() Future> shareGallery(@Part(name: "gid") int gid, diff --git a/lib/api/client.g.dart b/lib/api/client.g.dart index 11696d6..8b46e90 100644 --- a/lib/api/client.g.dart +++ b/lib/api/client.g.dart @@ -1233,6 +1233,57 @@ class __EHApi implements _EHApi { return _value; } + @override + Future> deleteSharedToken( + String token, + String type, { + CancelToken? cancel, + }) async { + final _extra = {}; + final queryParameters = {}; + queryParameters.removeWhere((k, v) => v == null); + final _headers = {}; + final _data = FormData(); + _data.fields.add(MapEntry( + 'token', + token, + )); + _data.fields.add(MapEntry( + 'type', + type, + )); + final _options = _setStreamType>(Options( + method: 'DELETE', + headers: _headers, + extra: _extra, + contentType: 'multipart/form-data', + ) + .compose( + _dio.options, + '/shared_token', + queryParameters: queryParameters, + data: _data, + cancelToken: cancel, + ) + .copyWith( + baseUrl: _combineBaseUrls( + _dio.options.baseUrl, + baseUrl, + ))); + final _result = await _dio.fetch>(_options); + late ApiResult _value; + try { + _value = ApiResult.fromJson( + _result.data!, + (json) => json as bool, + ); + } on Object catch (e, s) { + errorLogger?.logError(e, s, _options); + rethrow; + } + return _value; + } + @override Future> shareGallery( int gid, { diff --git a/lib/dialog/gallery_share_page.dart b/lib/dialog/gallery_share_page.dart index 4809a01..165c178 100644 --- a/lib/dialog/gallery_share_page.dart +++ b/lib/dialog/gallery_share_page.dart @@ -53,6 +53,22 @@ Future _add(int gid, DateTime? expired, AppLocalizations i18n) async { } } +Future _delete(String token, AppLocalizations i18n) async { + try { + (await api.deleteSharedToken(token, "gallery")).unwrap(); + listener.tryEmit("gallery_share_token_removed", token); + } catch (e, stack) { + String errmsg = "${i18n.failedDeleteShare}$e"; + if (e is (int, String)) { + _log.warning("Failed to delete shared token: $e"); + } else { + _log.severe("Failed to delete shared token: $e\n$stack"); + } + final snack = SnackBar(content: Text(errmsg)); + rootScaffoldMessengerKey.currentState?.showSnackBar(snack); + } +} + class _ChangeDialog extends StatefulWidget { const _ChangeDialog(this.gid, {this.token}); final int gid; @@ -230,10 +246,22 @@ class _GallerySharePage extends State { } } + void onTokenRemoved(dynamic arg) { + if (_lists == null) return; + final t = arg as String; + final ind = _lists!.indexWhere((a) => a.token.token == t); + if (ind != -1) { + setState(() { + _lists!.removeAt(ind); + }); + } + } + @override void initState() { listener.on("gallery_share_token_changed", onTokenChanged); listener.on("gallery_share_token_added", onTokenAdded); + listener.on("gallery_share_token_removed", onTokenRemoved); super.initState(); } @@ -242,6 +270,7 @@ class _GallerySharePage extends State { _cancel?.cancel(); listener.removeEventListener("gallery_share_token_changed", onTokenChanged); listener.removeEventListener("gallery_share_token_added", onTokenAdded); + listener.removeEventListener("gallery_share_token_removed", onTokenRemoved); super.dispose(); } @@ -319,7 +348,22 @@ class _GallerySharePage extends State { onPressed: () => showDialog( context: context, builder: (context) { - return AlertDialog(title: Text(i18n.delete)); + return AlertDialog( + title: Text(i18n.delete), + content: Text(i18n.deleteShareConfirm), + actions: [ + TextButton( + onPressed: () { + context.pop(); + _delete(item.token.token, i18n); + }, + child: Text(i18n.yes)), + TextButton( + onPressed: () { + context.pop(); + }, + child: Text(i18n.no)), + ]); }), icon: const Icon(Icons.delete)), ]), diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7e4511e..993798d 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -355,5 +355,7 @@ "lastUsedTime": "Last used time", "device": "Device", "failedDeleteSession": "Failed to delete session: ", - "allUser": "All users" + "allUser": "All users", + "deleteShareConfirm": "Do you want to delete shared token?", + "failedDeleteShare": "Failed to delete shared token: " } diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index c7ec932..6e4a00f 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -355,5 +355,7 @@ "lastUsedTime": "上次使用时间", "device": "设备", "failedDeleteSession": "删除会话失败:", - "allUser": "所有用户" + "allUser": "所有用户", + "deleteShareConfirm": "是否删除分享令牌?", + "failedDeleteShare": "删除分享令牌失败:" }