filePickerList static method

Widget filePickerList({
  1. required dynamic onFileSelected(
    1. List<FileData> fileData
    ),
  2. required dynamic onFileDeleted(
    1. List<FileData> fileData
    ),
  3. required dynamic onFileEdited(
    1. List<FileData> fileData
    ),
  4. String? title,
  5. List<FileData> files = const <FileData>[],
  6. FileType? fileType,
  7. String? parentId,
})

Implementation

static Widget filePickerList({
  required final Function(List<FileData> fileData) onFileSelected,
  required final Function(List<FileData> fileData) onFileDeleted,
  required final Function(List<FileData> fileData) onFileEdited,
  final String? title,
  final List<FileData> files = const <FileData>[],
  final FileType? fileType,
  final String? parentId,
}) {
  final RxList<FileData> oldFiles = files.obs;
  final RxList<FileData> addedFiles = <FileData>[].obs;
  final RxList<FileData> deletedFiles = <FileData>[].obs;

  Widget addIcon({required final VoidCallback onTap}) => const Icon(Icons.add, color: Colors.blue, size: 50)
      .container(
        radius: 12,
        width: 150,
        height: 150,
        borderWidth: 4,
        borderColor: Colors.blue,
        margin: const EdgeInsets.all(12),
      )
      .onTap(onTap);

  Widget fileIcon({
    required final FileData data,
    required final Function(FileData i) onFileDeleted,
    required final Function(FileData i) onFileEdited,
  }) =>
      Column(
        children: <Widget>[
          Column(
            children: <Widget>[
              ExpansionTile(
                title: Row(
                  children: <Widget>[
                    if (data.url != null && data.url!.isImageFileName)
                      UImage(
                        data.url!,
                        width: 150,
                        height: 150,
                        borderRadius: 12,
                        fit: BoxFit.cover,
                      ).pAll(12)
                    else if (data.url != null && !data.url!.isImageFileName)
                      Icon(
                        data.url!.isPDFFileName ? Icons.picture_as_pdf_outlined : Icons.videocam_outlined,
                        color: Colors.red,
                        size: 50,
                      ).container(
                        radius: 12,
                        width: 150,
                        height: 150,
                        borderWidth: 4,
                        borderColor: Colors.red,
                        margin: const EdgeInsets.all(12),
                      )
                    else if (data.extension!.isImageFileName)
                      UImage(
                        "",
                        fileData: data,
                        width: 150,
                        height: 150,
                        borderRadius: 12,
                        fit: BoxFit.cover,
                      ).pAll(12)
                    else if (!data.extension!.isImageFileName)
                      Icon(
                        data.extension!.isPDFFileName ? Icons.picture_as_pdf_outlined : Icons.videocam_outlined,
                        color: Colors.red,
                        size: 50,
                      ).container(
                        radius: 12,
                        width: 150,
                        height: 150,
                        borderWidth: 4,
                        borderColor: Colors.red,
                        margin: const EdgeInsets.all(12),
                      ),
                    Column(
                      children: <Widget>[
                        UTextField(
                          labelText: "عنوان",
                          initialValue: data.jsonDetail?.title,
                          onChanged: (final String value) {
                            data.jsonDetail?.title = value;
                            onFileEdited(data);
                          },
                        ).pAll(8),
                        UTextField(
                          labelText: "توضیحات",
                          initialValue: data.jsonDetail?.description,
                          onChanged: (final String value) {
                            data.jsonDetail?.description = value;
                            onFileEdited(data);
                          },
                        ).pAll(8),
                        Row(
                          children: <Widget>[
                            UTextField(
                              labelText: "لینک ۱",
                              initialValue: data.jsonDetail?.link1,
                              onChanged: (final String value) {
                                data.jsonDetail?.link1 = value;
                                onFileEdited(data);
                              },
                            ).pAll(8).expanded(),
                            UTextField(
                              labelText: "لینک ۲",
                              initialValue: data.jsonDetail?.link2,
                              onChanged: (final String value) {
                                data.jsonDetail?.link2 = value;
                                onFileEdited(data);
                              },
                            ).pAll(8).expanded(),
                          ],
                        ),
                      ],
                    ).expanded(),
                    if (data.parentId == null)
                      addIcon(
                        onTap: () {
                          showFilePicker(
                            allowMultiple: true,
                            action: (final List<FileData> files) {
                              addedFiles.addAll(
                                files.map((final FileData e) => e..parentId = data.id).toList(),
                              );
                              onFileSelected(addedFiles);
                            },
                          );
                        },
                      ),
                    IconButton(
                      onPressed: () => onFileDeleted(data),
                      icon: const Icon(Icons.delete, color: Colors.red),
                    ),
                  ],
                ).pOnly(
                  top: data.parentId == null ? 20 : 8,
                  bottom: data.parentId == null ? 20 : 8,
                  right: data.parentId == null ? 0 : 60,
                ),
                children: <Widget>[
                  ...(data.children ?? <FileData>[])
                      .map(
                        (final FileData e) => fileIcon(
                          data: e,
                          onFileDeleted: onFileDeleted,
                          onFileEdited: (final FileData i) {},
                        ),
                      )
                      .toList(),
                ],
              ),
              if (data.parentId == null) const Divider(thickness: 4, color: Colors.blue) else const Divider(),
            ],
          ),
        ],
      );

  return Column(
    crossAxisAlignment: CrossAxisAlignment.start,
    children: <Widget>[
      if (title != null) Text(title).titleMedium(),
      const SizedBox(height: 8),
      Obx(
        () => Column(
          children: <Widget>[
            ...oldFiles
                .mapIndexed(
                  (final int index, final FileData i) => fileIcon(
                    data: i,
                    onFileDeleted: (final FileData data) {
                      oldFiles.remove(data);
                      deletedFiles.add(data);
                      onFileDeleted(deletedFiles);
                    },
                    onFileEdited: (final FileData i) {
                      oldFiles[index] = i;
                      onFileEdited(oldFiles);
                    },
                  ),
                )
                .toList(),
            ...addedFiles
                .mapIndexed(
                  (final int index, final FileData i) => fileIcon(
                    data: i,
                    onFileDeleted: (final FileData i) {
                      addedFiles.remove(i);
                      deletedFiles.add(i);
                      onFileDeleted(deletedFiles);
                    },
                    onFileEdited: (final FileData i) => addedFiles[index] = i,
                  ),
                )
                .toList(),
            addIcon(
              onTap: () => showFilePicker(
                allowMultiple: true,
                action: (final List<FileData> files) {
                  addedFiles.addAll(files.map((final FileData e) => e..id = UUtils.uuidV4()).toList());
                  onFileSelected(addedFiles);
                },
              ),
            ),
          ],
        ),
      ),
    ],
  );
}