♻️ Refactored publisher creation into sheet

This commit is contained in:
2025-11-09 21:18:34 +08:00
parent eb4942e0ed
commit 1395d65b76
7 changed files with 55 additions and 49 deletions

View File

@@ -42,7 +42,6 @@ import 'package:island/screens/stickers/pack_detail.dart';
import 'package:island/screens/discovery/feeds/feed_marketplace.dart'; import 'package:island/screens/discovery/feeds/feed_marketplace.dart';
import 'package:island/screens/discovery/feeds/feed_detail.dart'; import 'package:island/screens/discovery/feeds/feed_detail.dart';
import 'package:island/screens/creators/poll/poll_list.dart'; import 'package:island/screens/creators/poll/poll_list.dart';
import 'package:island/screens/creators/publishers_form.dart';
import 'package:island/screens/creators/webfeed/webfeed_list.dart'; import 'package:island/screens/creators/webfeed/webfeed_list.dart';
import 'package:island/screens/poll/poll_editor.dart'; import 'package:island/screens/poll/poll_editor.dart';
import 'package:island/screens/posts/compose.dart'; import 'package:island/screens/posts/compose.dart';
@@ -507,19 +506,6 @@ final routerProvider = Provider<GoRouter>((ref) {
return StickersScreen(pubName: name); return StickersScreen(pubName: name);
}, },
), ),
GoRoute(
name: 'creatorNew',
path: 'new',
builder: (context, state) => const NewPublisherScreen(),
),
GoRoute(
name: 'creatorEdit',
path: ':name/edit',
builder: (context, state) {
final name = state.pathParameters['name']!;
return EditPublisherScreen(name: name);
},
),
], ],
), ),

View File

@@ -261,7 +261,11 @@ class _PublisherUnselectedWidget extends HookConsumerWidget {
subtitle: Text('createPublisherHint').tr(), subtitle: Text('createPublisherHint').tr(),
trailing: const Icon(Symbols.chevron_right), trailing: const Icon(Symbols.chevron_right),
onTap: () { onTap: () {
context.pushNamed('creatorNew').then((value) { showModalBottomSheet(
context: context,
isScrollControlled: true,
builder: (context) => const NewPublisherScreen(),
).then((value) {
if (value != null) { if (value != null) {
ref.invalidate(publishersManagedProvider); ref.invalidate(publishersManagedProvider);
} }
@@ -285,18 +289,17 @@ class CreatorHubScreen extends HookConsumerWidget {
); );
void updatePublisher() { void updatePublisher() {
context showModalBottomSheet(
.pushNamed( context: context,
'creatorEdit', isScrollControlled: true,
pathParameters: {'name': currentPublisher.value!.name}, builder:
) (context) =>
.then((value) async { EditPublisherScreen(name: currentPublisher.value!.name),
).then((value) async {
if (value == null) return; if (value == null) return;
final data = await ref.refresh(publishersManagedProvider.future); final data = await ref.refresh(publishersManagedProvider.future);
currentPublisher.value = currentPublisher.value =
data data.where((e) => e.id == currentPublisher.value!.id).firstOrNull;
.where((e) => e.id == currentPublisher.value!.id)
.firstOrNull;
}); });
} }

View File

@@ -16,8 +16,8 @@ import 'package:island/screens/realm/realms.dart';
import 'package:island/services/file.dart'; import 'package:island/services/file.dart';
import 'package:island/services/file_uploader.dart'; import 'package:island/services/file_uploader.dart';
import 'package:island/widgets/alert.dart'; import 'package:island/widgets/alert.dart';
import 'package:island/widgets/app_scaffold.dart';
import 'package:island/widgets/content/cloud_files.dart'; import 'package:island/widgets/content/cloud_files.dart';
import 'package:island/widgets/content/sheet.dart';
import 'package:material_symbols_icons/symbols.dart'; import 'package:material_symbols_icons/symbols.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:styled_widget/styled_widget.dart'; import 'package:styled_widget/styled_widget.dart';
@@ -177,13 +177,11 @@ class EditPublisherScreen extends HookConsumerWidget {
} }
} }
return AppScaffold( final titleText = (name == null ? 'createPublisher' : 'editPublisher').tr();
isNoBackground: false,
appBar: AppBar( return SheetScaffold(
title: Text(name == null ? 'createPublisher' : 'editPublisher').tr(), titleText: titleText,
leading: const PageBackButton(), child: SingleChildScrollView(
),
body: SingleChildScrollView(
padding: EdgeInsets.only(bottom: 16), padding: EdgeInsets.only(bottom: 16),
child: Column( child: Column(
children: [ children: [

View File

@@ -128,7 +128,13 @@ class FileUploader {
/// Completes the upload and returns the CloudFile object. /// Completes the upload and returns the CloudFile object.
Future<SnCloudFile> completeUpload(String taskId) async { Future<SnCloudFile> completeUpload(String taskId) async {
final response = await _client.post('/drive/files/upload/complete/$taskId'); final response = await _client.post(
'/drive/files/upload/complete/$taskId',
options: Options(
sendTimeout: Duration(minutes: 1),
receiveTimeout: Duration(minutes: 1),
),
);
return SnCloudFile.fromJson(response.data); return SnCloudFile.fromJson(response.data);
} }

View File

@@ -4,7 +4,6 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/models/file.dart'; import 'package:island/models/file.dart';
import 'package:island/models/post.dart'; import 'package:island/models/post.dart';
@@ -330,7 +329,13 @@ class PostComposeCard extends HookConsumerWidget {
if (isContained) { if (isContained) {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
context.pushNamed('creatorNew').then((value) { showModalBottomSheet(
context: context,
isScrollControlled: true,
useRootNavigator: true,
builder:
(context) => const NewPublisherScreen(),
).then((value) {
if (value != null) { if (value != null) {
composeState.currentPublisher.value = composeState.currentPublisher.value =
value as SnPublisher; value as SnPublisher;
@@ -368,9 +373,14 @@ class PostComposeCard extends HookConsumerWidget {
if (isContained) { if (isContained) {
Navigator.of(context).pop(); Navigator.of(context).pop();
} }
context.pushNamed('creatorNew').then(( showModalBottomSheet(
value, context: context,
) { isScrollControlled: true,
useRootNavigator: true,
builder:
(context) =>
const NewPublisherScreen(),
).then((value) {
if (value != null) { if (value != null) {
composeState.currentPublisher.value = composeState.currentPublisher.value =
value as SnPublisher; value as SnPublisher;

View File

@@ -123,7 +123,7 @@ class ComposeLogic {
slugController: TextEditingController(text: originalPost?.slug), slugController: TextEditingController(text: originalPost?.slug),
visibility: ValueNotifier<int>(originalPost?.visibility ?? 0), visibility: ValueNotifier<int>(originalPost?.visibility ?? 0),
submitting: ValueNotifier<bool>(false), submitting: ValueNotifier<bool>(false),
attachmentProgress: ValueNotifier<Map<int, double>>({}), attachmentProgress: ValueNotifier<Map<int, double?>>({}),
currentPublisher: ValueNotifier<SnPublisher?>(originalPost?.publisher), currentPublisher: ValueNotifier<SnPublisher?>(originalPost?.publisher),
tags: ValueNotifier<List<String>>(tags), tags: ValueNotifier<List<String>>(tags),
categories: ValueNotifier<List<SnPostCategory>>(categories), categories: ValueNotifier<List<SnPostCategory>>(categories),
@@ -149,7 +149,7 @@ class ComposeLogic {
slugController: TextEditingController(text: draft.slug), slugController: TextEditingController(text: draft.slug),
visibility: ValueNotifier<int>(draft.visibility), visibility: ValueNotifier<int>(draft.visibility),
submitting: ValueNotifier<bool>(false), submitting: ValueNotifier<bool>(false),
attachmentProgress: ValueNotifier<Map<int, double>>({}), attachmentProgress: ValueNotifier<Map<int, double?>>({}),
currentPublisher: ValueNotifier<SnPublisher?>(null), currentPublisher: ValueNotifier<SnPublisher?>(null),
tags: ValueNotifier<List<String>>(tags), tags: ValueNotifier<List<String>>(tags),
categories: ValueNotifier<List<SnPostCategory>>(draft.categories), categories: ValueNotifier<List<SnPostCategory>>(draft.categories),
@@ -500,7 +500,7 @@ class ComposeLogic {
try { try {
state.attachmentProgress.value = { state.attachmentProgress.value = {
...state.attachmentProgress.value, ...state.attachmentProgress.value,
index: 0, index: 0.0,
}; };
SnCloudFile? cloudFile; SnCloudFile? cloudFile;

View File

@@ -3,7 +3,6 @@ import 'dart:math' as math;
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gap/gap.dart'; import 'package:gap/gap.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:island/screens/creators/publishers_form.dart'; import 'package:island/screens/creators/publishers_form.dart';
import 'package:island/widgets/content/cloud_files.dart'; import 'package:island/widgets/content/cloud_files.dart';
@@ -43,9 +42,13 @@ class PublisherModal extends HookConsumerWidget {
const Gap(12), const Gap(12),
ElevatedButton( ElevatedButton(
onPressed: () { onPressed: () {
context.pushNamed('creatorNew').then(( showModalBottomSheet(
value, context: context,
) { isScrollControlled: true,
builder:
(context) =>
const NewPublisherScreen(),
).then((value) {
if (value != null) { if (value != null) {
ref.invalidate( ref.invalidate(
publishersManagedProvider, publishersManagedProvider,