Skip to content

Commit d632337

Browse files
merge
2 parents f6e7116 + 87e8f1b commit d632337

File tree

6 files changed

+103
-16
lines changed

6 files changed

+103
-16
lines changed

lib/blocs/create_manifest/create_manifest_cubit.dart

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,43 @@ class CreateManifestCubit extends Cubit<CreateManifestState> {
6363
// Private manifests need more consideration and are currently unavailable
6464
emit(CreateManifestPrivacyMismatch());
6565
}
66+
// Initialize folder selection immediately in the new workflow
67+
_initFolderSelection();
68+
}
69+
70+
/// Initialize folder selection on creation
71+
Future<void> _initFolderSelection() async {
72+
logger.i('Initializing folder selection for drive: ${_drive.id}');
73+
rootFolderNode =
74+
await _folderRepository.getFolderNode(_drive.id, _drive.rootFolderId);
75+
logger.d('Root folder node loaded with id: ${rootFolderNode.folder.id}');
76+
77+
_hasPendingFiles = await _hasPendingFilesInFolder(rootFolderNode);
78+
logger.d('Folder has pending files: $_hasPendingFiles');
79+
80+
await loadFolder(_drive.rootFolderId);
81+
}
82+
83+
/// User has selected a folder and is ready to proceed to name input
84+
void promptForManifestName() {
85+
logger.i('Prompting for manifest name');
86+
final state = this.state as CreateManifestFolderLoadSuccess;
87+
emit(CreateManifestNameInput(
88+
parentFolder: state.viewingFolder.folder,
89+
fallbackTxId: state.fallbackTxId,
90+
));
91+
}
92+
93+
/// Process manifest name and check for conflicts
94+
Future<void> processManifestName(String name) async {
95+
logger.i('Processing manifest name: $name');
96+
if (state is CreateManifestNameInput) {
97+
final nameInputState = state as CreateManifestNameInput;
98+
final parentFolder = nameInputState.parentFolder;
99+
100+
emit(CreateManifestCheckingForConflicts(parentFolder: parentFolder));
101+
await checkNameConflicts(name);
102+
}
66103
}
67104

68105
void selectUploadMethod(
@@ -371,6 +408,7 @@ class CreateManifestCubit extends Cubit<CreateManifestState> {
371408

372409
emit(CreateManifestSuccess(
373410
nameAssignedByArNS: _selectedUndername != null,
411+
parentFolder: createManifestUploadReview.parentFolder,
374412
));
375413
} catch (e) {
376414
logger.e('An error occured uploading the manifest.', e);

lib/blocs/create_manifest/create_manifest_state.dart

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,23 @@ abstract class CreateManifestState extends Equatable {
66
List get props => [];
77
}
88

9-
/// Initial state where user begins by selecting a name for the manifest
9+
/// Initial state where user begins by selecting a folder for the manifest
1010
class CreateManifestInitial extends CreateManifestState {}
1111

12+
/// Folder has been selected, now user enters a name for the manifest
13+
class CreateManifestNameInput extends CreateManifestState {
14+
final FolderEntry parentFolder;
15+
final String? fallbackTxId;
16+
17+
CreateManifestNameInput({
18+
required this.parentFolder,
19+
this.fallbackTxId,
20+
});
21+
22+
@override
23+
List<Object?> get props => [parentFolder, fallbackTxId];
24+
}
25+
1226
/// Name has been selected, user is now selecting which folder to create a manifest of
1327
class CreateManifestFolderLoadSuccess extends CreateManifestState {
1428
final bool viewingRootFolder;
@@ -218,8 +232,12 @@ class CreateManifestFailure extends CreateManifestState {}
218232
/// Manifest transaction has been successfully uploaded
219233
class CreateManifestSuccess extends CreateManifestState {
220234
final bool nameAssignedByArNS;
235+
final FolderEntry parentFolder;
221236

222-
CreateManifestSuccess({this.nameAssignedByArNS = false});
237+
CreateManifestSuccess({
238+
required this.parentFolder,
239+
this.nameAssignedByArNS = false,
240+
});
223241
}
224242

225243
enum CreateManifestUploadProgress {

lib/components/create_manifest_form.dart

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -201,9 +201,15 @@ class _CreateManifestFormState extends State<CreateManifestForm> {
201201
textStyle: textStyle,
202202
);
203203
} else if (state is CreateManifestInitial) {
204-
return _createManifestInitial(
204+
return const ProgressDialog(
205+
useNewArDriveUI: true,
206+
title: 'Loading Folders...',
207+
);
208+
} else if (state is CreateManifestNameInput) {
209+
return _createManifestNameInput(
205210
context: context,
206211
textStyle: textStyle,
212+
state: state,
207213
);
208214
}
209215
if (state is CreateManifestUploadInProgress) {
@@ -292,7 +298,9 @@ class _CreateManifestFormState extends State<CreateManifestForm> {
292298
actions: [
293299
ModalAction(
294300
action: () {
295-
context.read<DriveDetailCubit>().refreshDriveDataTable();
301+
context
302+
.read<DriveDetailCubit>()
303+
.openFolder(folderId: state.parentFolder.id);
296304
Navigator.pop(context);
297305
},
298306
title: 'Close',
@@ -450,9 +458,10 @@ class _CreateManifestFormState extends State<CreateManifestForm> {
450458
);
451459
}
452460

453-
Widget _createManifestInitial({
461+
Widget _createManifestNameInput({
454462
required BuildContext context,
455463
required TextStyle textStyle,
464+
required CreateManifestNameInput state,
456465
}) {
457466
return ArDriveStandardModalNew(
458467
width: kLargeDialogWidth,
@@ -999,8 +1008,8 @@ class _CreateManifestFormState extends State<CreateManifestForm> {
9991008
),
10001009
action: ModalAction(
10011010
isEnable: state.enableManifestCreationButton,
1002-
action: () => cubit.checkForConflicts(_manifestNameController.text),
1003-
title: appLocalizationsOf(context).createHereEmphasized,
1011+
action: () => cubit.promptForManifestName(),
1012+
title: appLocalizationsOf(context).nextEmphasized,
10041013
),
10051014
);
10061015
}

lib/components/new_button/new_button.dart

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -337,15 +337,22 @@ class NewButton extends StatelessWidget {
337337
if (driveDetailState.currentDrive.privacy == 'public')
338338
ArDriveNewButtonItem(
339339
onClick: () {
340-
promptToCreateManifest(
341-
context,
342-
drive: drive!,
343-
// TODO: for big drives, this might will be slow
344-
hasPendingFiles: driveDetailState.currentFolderContents.any(
345-
(element) =>
346-
element.fileStatusFromTransactions ==
347-
TransactionStatus.pending,
348-
),
340+
// wait 100 ms before creating manifest
341+
Future.delayed(
342+
const Duration(milliseconds: 100),
343+
() {
344+
promptToCreateManifest(
345+
context,
346+
drive: drive!,
347+
// TODO: for big drives, this might will be slow
348+
hasPendingFiles:
349+
driveDetailState.currentFolderContents.any(
350+
(element) =>
351+
element.fileStatusFromTransactions ==
352+
TransactionStatus.pending,
353+
),
354+
);
355+
},
349356
);
350357
},
351358
isDisabled: !driveDetailState.hasWritePermissions ||

lib/components/side_bar.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,8 @@ class _Accordion extends StatelessWidget {
691691
hasAlert: state.drivesWithAlerts.contains(d.id),
692692
drive: d,
693693
onTap: () {
694+
_closeDrawer(context);
695+
694696
if (state.selectedDriveId == d.id) {
695697
// opens the root folder
696698
context.read<DriveDetailCubit>().openFolder();
@@ -726,6 +728,8 @@ class _Accordion extends StatelessWidget {
726728
hasAlert: state.drivesWithAlerts.contains(d.id),
727729
drive: d,
728730
onTap: () {
731+
_closeDrawer(context);
732+
729733
context.read<DrivesCubit>().selectDrive(d.id);
730734
},
731735
isSelected: state.selectedDriveId == d.id,
@@ -751,6 +755,8 @@ class _Accordion extends StatelessWidget {
751755
hasAlert: state.drivesWithAlerts.contains(d.id),
752756
drive: d,
753757
onTap: () {
758+
_closeDrawer(context);
759+
754760
context.read<DrivesCubit>().selectDrive(d.id);
755761
},
756762
isSelected: state.selectedDriveId == d.id,
@@ -764,5 +770,11 @@ class _Accordion extends StatelessWidget {
764770
},
765771
);
766772
}
773+
774+
void _closeDrawer(BuildContext context) {
775+
if (Scaffold.maybeOf(context) != null) {
776+
Scaffold.of(context).closeDrawer();
777+
}
778+
}
767779
}
768780
//

lib/pages/no_drives/no_drives_page.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import 'package:ardrive/app_shell.dart';
22
import 'package:ardrive/authentication/components/login_modal.dart';
33
import 'package:ardrive/blocs/drive_detail/drive_detail_cubit.dart';
4+
import 'package:ardrive/components/app_top_bar.dart';
45
import 'package:ardrive/components/drive_create_form.dart';
56
import 'package:ardrive/components/profile_card.dart';
67
import 'package:ardrive/components/topbar/help_button.dart';
@@ -64,6 +65,8 @@ class NoDrivesPage extends StatelessWidget {
6465
const Row(
6566
mainAxisAlignment: MainAxisAlignment.end,
6667
children: [
68+
SyncButton(),
69+
SizedBox(width: 8),
6770
HelpButtonTopBar(),
6871
SizedBox(width: 8),
6972
ProfileCard(),

0 commit comments

Comments
 (0)