Skip to content

Commit

Permalink
Merge pull request #101 from fleetimee/upload_files
Browse files Browse the repository at this point in the history
  • Loading branch information
fleetimee authored Nov 30, 2022
2 parents 1ffd81f + 51fb7e6 commit 8b5203d
Show file tree
Hide file tree
Showing 26 changed files with 1,181 additions and 732 deletions.
1 change: 1 addition & 0 deletions android/app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
android:value="2" />
</application>
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
</manifest>
Binary file added assets/images/home/process-upload.zip
Binary file not shown.
Binary file added assets/images/home/upload-files.zip
Binary file not shown.
4 changes: 2 additions & 2 deletions lib/app/common/constant.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@
// 'https://9bf0-2001-448a-4049-68c4-c80c-e641-b21d-cb5c.ap.ngrok.io/api/v1/';

const baseUrl =
'https://number-41-bagooska-the-terribly-tired-tapir-3.fleetimee.repl.co/api/v1/';
'https://number-41-bagooska-the-terribly-tired-tapir.fleetimee.repl.co/api/v1/';

// List debitur field string
const field =
'peminjam1,bidang_usaha,jenis_usaha,tgl_sekarang,umur,ktp1,progress';

// Insight debitur query string
const joinTable =
'join=inputNeraca&join=inputRugiLaba&join=inputKeuangan&join=analisaKeuangan&join=analisaKarakter&join=analisaBisnis&join=analisaJenisUsaha&join=agunan&join=agunan.form_tanah&join=agunan.form_kendaraan&join=agunan.form_los&join=agunan.form_peralatan&join=agunan.form_cash&join=agunan.form_lainnya&join=agunan.form_tanah_bangunan&join=syaratLain&join=analisaAgunan&join=ijinLegitimasi&join=asuransi';
'join=inputNeraca&join=inputRugiLaba&join=inputKeuangan&join=analisaKeuangan&join=analisaKarakter&join=analisaBisnis&join=analisaJenisUsaha&join=agunan&join=agunan.form_tanah&join=agunan.form_kendaraan&join=agunan.form_los&join=agunan.form_peralatan&join=agunan.form_cash&join=agunan.form_lainnya&join=agunan.form_tanah_bangunan&join=syaratLain&join=analisaAgunan&join=ijinLegitimasi&join=asuransi&join=upload';
74 changes: 74 additions & 0 deletions lib/app/data/provider/media/save_mediaprovider.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
// 🎯 Dart imports:

// 🐦 Flutter imports:

// 📦 Package imports:
import 'dart:convert';

import 'package:akm/app/common/constant.dart';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart' as http;

// 🌎 Project imports:
import 'package:akm/app/models/debitur_model/insight_debitur.model.dart';

class MediaProvider {
final httpClient = http.Client();

Future<List<Upload>> fetchMedia(int id) async {
try {
final response = await httpClient.get(
Uri.parse('${baseUrl}debiturs/$id/uploads/'),
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
);
debugPrint(response.body);

if (response.statusCode == 200) {
var data = jsonDecode(response.body);
debugPrint(data.toString());
return (data as List).map((e) => Upload.fromJson(e)).toList();
} else {
throw Exception('Failed to load data');
}
} catch (e) {
return Future.error(e);
}
}

Future<Upload> saveMedia(int id, body) async {
try {
final response = http.MultipartRequest(
'POST',
Uri.parse('${baseUrl}debiturs/$id/uploads/'),
)
..headers.addAll(
{
'Content-Type': 'application/json',
'Accept': 'application/json',
},
)
..files.add(await http.MultipartFile.fromPath('file', body['file']));

response.fields.addAll(
Map<String, String>.from(body),
);

var res = await response.send();

final resBody = await res.stream.bytesToString();

debugPrint(resBody);

if (res.statusCode == 201) {
return Upload.fromJson(jsonDecode(resBody));
} else {
throw Exception('Failed to load data');
}
} catch (e) {
return Future.error(e);
}
}
}
50 changes: 50 additions & 0 deletions lib/app/models/debitur_model/insight_debitur.model.dart
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ class DebiturInsight {
this.syaratLain,
this.asuransi,
this.analisaAgunan,
this.upload,
});

int? id;
Expand Down Expand Up @@ -109,6 +110,7 @@ class DebiturInsight {
List<Agunan>? agunan;
List<SyaratLain>? syaratLain;
AnalisaAgunan? analisaAgunan;
List<Upload>? upload;

factory DebiturInsight.fromJson(Map<String, dynamic> json) => DebiturInsight(
id: json["id"],
Expand Down Expand Up @@ -188,6 +190,9 @@ class DebiturInsight {
analisaAgunan: json["analisaAgunan"] == null
? null
: AnalisaAgunan.fromJson(json["analisaAgunan"]),
upload: json["upload"] == null
? null
: List<Upload>.from(json["upload"].map((x) => Upload.fromJson(x))),
);

Map<String, dynamic> toJson() => {
Expand Down Expand Up @@ -249,6 +254,51 @@ class DebiturInsight {
? null
: List<dynamic>.from(syaratLain!.map((x) => x.toJson())),
"analisaAgunan": analisaAgunan == null ? null : analisaAgunan?.toJson(),
"upload": upload == null
? null
: List<dynamic>.from(upload!.map((x) => x.toJson())),
};
}

class Upload {
Upload({
this.id,
this.keterangan,
this.file,
this.createdDate,
this.updatedDate,
this.debiturId,
});

int? id;
String? keterangan;
String? file;
DateTime? createdDate;
DateTime? updatedDate;
int? debiturId;

factory Upload.fromJson(Map<String, dynamic> json) => Upload(
id: json["id"] ?? null,
keterangan: json["keterangan"] ?? null,
file: json["file"] ?? null,
createdDate: json["createdDate"] == null
? null
: DateTime.parse(json["createdDate"]),
updatedDate: json["updatedDate"] == null
? null
: DateTime.parse(json["updatedDate"]),
debiturId: json["debiturId"] ?? null,
);

Map<String, dynamic> toJson() => {
"id": id ?? null,
"keterangan": keterangan ?? null,
"file": file ?? null,
"createdDate":
createdDate == null ? null : createdDate?.toIso8601String(),
"updatedDate":
updatedDate == null ? null : updatedDate?.toIso8601String(),
"debiturId": debiturId ?? null,
};
}

Expand Down
1 change: 0 additions & 1 deletion lib/app/modules/asuransi/views/asuransi_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,6 @@ class AsuransiView extends GetView<AsuransiController> {
keyboardType: TextInputType.number,
validator: FormBuilderValidators.compose([
FormBuilderValidators.required(),
FormBuilderValidators.numeric(),
]),
autovalidateMode: AutovalidateMode.onUserInteraction,
decoration: const InputDecoration(
Expand Down
12 changes: 12 additions & 0 deletions lib/app/modules/gallery_image/bindings/gallery_image_binding.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import 'package:get/get.dart';

import '../controllers/gallery_image_controller.dart';

class GalleryImageBinding extends Bindings {
@override
void dependencies() {
Get.lazyPut<GalleryImageController>(
() => GalleryImageController(),
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
import 'dart:io';

import 'package:akm/app/data/provider/media/save_mediaprovider.dart';
import 'package:akm/app/models/debitur_model/insight_debitur.model.dart';
import 'package:dio/dio.dart';
import 'package:flutter/material.dart';
import 'package:gallery_saver/gallery_saver.dart';
import 'package:get/get.dart';
import 'package:path_provider/path_provider.dart';
import 'package:share_plus/share_plus.dart';

class GalleryImageController extends GetxController {
@override
void onInit() {
getImages(debiturId.id);
super.onInit();
}

var imageList = List<Upload>.empty(growable: true).obs;

final isImageLoading = false.obs;

final isImageListView = false.obs;

final debiturId = Get.arguments;

void getImages(int id) {
try {
isImageLoading(true);
MediaProvider().fetchMedia(id).then((resp) {
isImageLoading(false);
imageList.addAll(resp);
}, onError: (e) {
isImageLoading(false);
Get.snackbar('Error', e.toString());
});
} catch (e) {
isImageLoading(false);
Get.snackbar('Error', e.toString());
}
}

void shareNetworkImage(String url, String filename) async {
Directory tempDir = await getTemporaryDirectory();

final path = tempDir.path;

await Dio().download(url, '$path/$filename.jpg');

Share.shareFiles(['$path/$filename.jpg']);
}

void downloadNetworkImage(
String url, String filename, String albumname) async {
Directory tempDir = await getTemporaryDirectory();

final path = tempDir.path;

await Dio().download(
url,
'$path/$filename.jpg',
);

GallerySaver.saveImage('$path/$filename.jpg', albumName: albumname);

Get.snackbar(
'Success',
'Image saved',
snackPosition: SnackPosition.BOTTOM,
colorText: Colors.white,
backgroundColor: Colors.green,
icon: const Icon(
Icons.check_circle,
color: Colors.white,
),
);
}
}
Loading

1 comment on commit 8b5203d

@vercel
Copy link

@vercel vercel bot commented on 8b5203d Nov 30, 2022

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.