Projet

Général

Profil

Paste
Statistiques
| Branche: | Révision:

root / src / app / home / home.component.ts @ 2c8d373c

Historique | Voir | Annoter | Télécharger (16 ko)

1
import { Component, OnInit } from "@angular/core";
2
import { takePicture, requestCameraPermissions } from 'nativescript-camera';
3
import { PhotoEditor, PhotoEditorControl } from "nativescript-photo-editor";
4
import { ImageAsset } from 'tns-core-modules/image-asset';
5
import { RadSideDrawer } from "nativescript-ui-sidedrawer";
6
import { knownFolders, Folder, File, path } from "tns-core-modules/file-system";
7
import { ImageSource, fromFile, fromResource, fromBase64, fromAsset } from "tns-core-modules/image-source";
8
import { Image } from "tns-core-modules/ui/image";
9
import { EventData } from "tns-core-modules/data/observable";
10
import { getViewById } from "tns-core-modules/ui/core/view";
11
import { TextField } from "tns-core-modules/ui/text-field";
12
import { isAndroid, isIOS, device, screen } from "tns-core-modules/platform";
13
import { ActivityIndicator } from "tns-core-modules/ui/activity-indicator";
14
import { getString, setString, hasKey, remove, clear } from "tns-core-modules/application-settings";
15
import { Button } from "tns-core-modules/ui/button";
16
import { NavigationEnd, Router } from "@angular/router";
17
import { RouterExtensions } from "nativescript-angular/router";
18

    
19
import * as bghttp from "nativescript-background-http";
20
import * as appversion from "nativescript-appversion";
21
import * as dialogs from "tns-core-modules/ui/dialogs";
22
import * as app from "tns-core-modules/application";
23
import * as imagepicker from "nativescript-imagepicker";
24

    
25
declare var NSString: any;
26
declare var NSUTF8StringEncoding: any;
27
declare var java: any;
28
declare var android: any;
29
@Component({
30
    selector: "Home",
31
    templateUrl: "./home.component.html"
32
})
33
export class HomeComponent implements OnInit {
34
    public cameraImage: ImageAsset;
35
    public pseudo: string;
36
    public email: string;
37
    public label: string;
38
    public legende: string;
39
    public album: string;
40
    public albumPass: string;
41
    private photoEditor;
42
    private appVersion;
43
    public serverName: string;
44
    public serverURI: string;
45
    public hasPicture: boolean;
46
    public isBusy: boolean = true;
47

    
48

    
49
    constructor(private router: Router, private routerExtensions: RouterExtensions) {
50
        // Use the component constructor to inject providers.
51
        appversion.getVersionName().then((v: string) => {
52
            if (isAndroid) {
53
                this.appVersion = "Android/" + v;
54
            }
55
            else if (isIOS) {
56
                this.appVersion = "iOS/" + v;
57
            }
58
            else {
59
                this.appVersion = "Other/" + v;
60
            }
61
            console.log("clicalbum: Your app's version is: " + this.appVersion);
62
        });
63
    }
64

    
65
    ngOnInit(): void {
66
        // Init your component properties here.
67
        this.photoEditor = new PhotoEditor();
68
        this.hasPicture = false;
69
        this.pseudo = getString("pseudo", "");
70
        this.email = getString("email", "");
71
        this.serverName = getString("serverName", "AbulEdu-FR");
72
        this.serverURI = getString("serverURI", "clicalbum.abuledu.net");
73
        this.album = getString("album", "");
74
        this.albumPass = getString("albumPass", "");
75
        this.label = "";
76
        this.legende = "";
77
        this.isBusy = false;
78
        this.enableButtons("btnSendPicture", false);
79

    
80
        if (this.email == "" || this.pseudo == "") {
81
            // alert("L'application n'est pas configurée ...")
82
            this.routerExtensions.navigate(["/settings"]);
83
        }
84

    
85
    }
86

    
87
    enableButtons(btnName, onOff) {
88
        let b = <Button>getViewById(app.getRootView(), btnName);
89
        if (b) {
90
            b.isEnabled = onOff;
91
        }
92
    }
93

    
94

    
95
    onBlur(args: EventData): void {
96
        let obj = <TextField>args.object;
97
        if (obj.id == "album") {
98
            this.album = obj.text.toLowerCase().replace(/[^a-z0-9]/g, "");
99
        }
100
        if (obj.id == "albumPass") {
101
            this.albumPass = obj.text.toLowerCase().replace(/[^a-z0-9]/g, "");
102
        }
103
    }
104

    
105
    onDrawerButtonTap(): void {
106
        const sideDrawer = <RadSideDrawer>app.getRootView();
107
        sideDrawer.showDrawer();
108
    }
109

    
110
    onGetPictureFromRollTap(args: EventData) {
111
        var that = this;
112
        let context = imagepicker.create({
113
            mode: "single" // use "multiple" for multiple selection
114
        });
115
        context
116
            .authorize()
117
            .then(function () {
118
                return context.present();
119
            })
120
            .then(function (selection) {
121
                selection.forEach(function (selected) {
122
                    let imageSource = new ImageSource();
123
                    imageSource.fromAsset(selected).then((imageSource) => {
124
                        console.log("ORIG IMAGE SIZE FROM ROLL: " + imageSource.height + " x " + imageSource.width);
125
                        console.dir(imageSource);
126
                        // console.log("un ter");
127

    
128
                        that.photoEditor.editPhoto({
129
                            imageSource: imageSource,
130
                            hiddenControls: [
131
                                PhotoEditorControl.Draw,
132
                                PhotoEditorControl.Text,
133
                                PhotoEditorControl.Clear,
134
                            ],
135
                        }).then((newImage: ImageSource) => {
136
                            console.log("NEW IMAGE: ", newImage.height, newImage.width);
137
                            that.imageCropped(newImage);
138
                            // Here you can save newImage, send it to your backend or simply display it in your app
139
                            // that.resultImage.imageSource = newImage;
140
                        }).catch((e) => {
141
                            console.log("erreur ES 1");
142
                            console.error(e);
143
                        });
144
                        console.log("trois");
145
                    });
146

    
147
                });
148
                console.log("Selection des fichiers ", selection);
149
            }).catch(function (e) {
150
                console.log("Error ES: " + e);
151
                // process error
152
            });
153

    
154
    }
155

    
156
    onTakePictureTap(args: EventData) {
157
        const options = {
158
            keepAspectRatio: true,
159
            saveToGallery: false
160
        };
161

    
162
        // let button = args.object as Button;
163
        requestCameraPermissions().then(
164
            () => {
165
                takePicture(options)
166
                    .then((imageAsset: any) => {
167
                        let imageSource = new ImageSource();
168

    
169
                        imageSource.fromAsset(imageAsset).then((imageSource) => {
170
                            console.log("ORIG IMAGE SIZE: " + imageSource.height + " x " + imageSource.width);
171
                            console.dir(imageSource);
172
                            // console.log("un ter");
173

    
174
                            this.photoEditor.editPhoto({
175
                                imageSource: imageSource,
176
                                hiddenControls: [
177
                                    PhotoEditorControl.Draw,
178
                                    PhotoEditorControl.Text,
179
                                    PhotoEditorControl.Clear,
180
                                ],
181
                            }).then((newImage: ImageSource) => {
182
                                console.log("NEW IMAGE: ", newImage.height, newImage.width);
183
                                this.imageCropped(newImage);
184
                                // Here you can save newImage, send it to your backend or simply display it in your app
185
                                // this.resultImage.imageSource = newImage;
186
                            }).catch((e) => {
187
                                console.log("erreur 1");
188
                                console.error(e);
189
                            });
190
                            console.log("trois");
191
                        });
192

    
193
                    }, (error) => {
194
                        console.log("Error: " + error);
195
                    });
196
            },
197
            () => alert('permissions rejected')
198
        );
199
    }
200

    
201
    onResetPictureTap(args) {
202
        // this.cameraImage = "res://icon";
203
    }
204

    
205
    onGotoWebTap() {
206
        if (this.album == "") {
207
            dialogs.alert({
208
                title: "Nom d'album",
209
                message: "Il faut renseigner le nom de l'album que vous voulez consulter ...",
210
                okButtonText: "Ok"
211
            }).then(() => {
212
            });
213
        }
214

    
215
        var utilityModule = require("utils/utils");
216
        utilityModule.openUrl("https://" + this.serverURI + "/" + this.album);
217
    }
218

    
219
    onSendPictureTap(args) {
220
        this.enableButtons("btnSendPicture", false)
221
        this.isBusy = true;
222
        let labelObj = <TextField>getViewById(app.getRootView(), "label");
223
        this.label = labelObj.text;
224
        let legendeObj = <TextField>getViewById(app.getRootView(), "legende");
225
        this.legende = legendeObj.text;
226
        let albumObj = <TextField>getViewById(app.getRootView(), "album");
227
        this.album = albumObj.text.toLowerCase().replace(/[^a-z0-9]/g, "");
228
        albumObj = <TextField>getViewById(app.getRootView(), "albumPass");
229
        this.albumPass = albumObj.text;
230

    
231
        console.log("on a maintenant ", this.albumPass);
232

    
233

    
234
        if (this.album == "" || this.label == "") {
235
            dialogs.alert({
236
                title: "Informations manquantes",
237
                message: "Il faut renseigner le nom de l'album auquel vous voulez participer et donner un nom à votre photo ...",
238
                okButtonText: "Ok"
239
            }).then(() => {
240
                this.enableButtons("btnSendPicture", true)
241
                this.isBusy = false;
242
                console.log("clicalbum: album ou label vide");
243
                return;
244
            });
245
        }
246
        else {
247
            setString("album", this.album);
248
            setString("albumPass", this.albumPass);
249
            this.sendPicture(args);
250
        }
251
    }
252

    
253
    sendPicture(args) {
254
        this.enableButtons("btnSendPicture", false)
255
        this.isBusy = true;
256
        // let button = args.object as Button;
257
        const folderPath: string = knownFolders.documents().path;
258
        const fileName = "fichier_temporaire.jpeg";
259
        const filePath = path.join(folderPath, fileName);
260
        let labelObj = <TextField>getViewById(app.getRootView(), "label");
261
        this.label = labelObj.text;
262
        let legendeObj = <TextField>getViewById(app.getRootView(), "legende");
263
        this.legende = legendeObj.text;
264

    
265
        console.log("On voudrait uploader le fichier " + filePath + " dans l'album " + this.album + " sous le nom " + this.label);
266

    
267
        if (this.serverURI == "") {
268
            dialogs.alert({
269
                title: "Serveur ????",
270
                message: "Suite à une collision dans l'espace-temps des nano particules permettant la bonne configuration du logiciel l'adresse du serveur s'est retrouvée vide ... bien entendu ce bug ne devrait pas surgir mais pour continuer vous devrez à nouveau choisir un serveur dans la configuration ... Merci pour votre compréhension",
271
                okButtonText: "Ok"
272
            }).then(() => {
273
                this.enableButtons("btnSendPicture", true)
274
                this.isBusy = false;
275
                console.log("clicalbum: Adresse serveur vide");
276
                return;
277
            });
278
        }
279

    
280
        var url = "https://" + this.serverURI + "/u.php";
281
        console.log("clicalbum: POST vers " + url);
282

    
283
        // // upload configuration
284
        var session = bghttp.session("image-upload");
285
        var request = {
286
            url: url,
287
            method: "POST",
288
            headers: {
289
                "Content-Type": "application/octet-stream",
290
                "User-Agent": "ClicAlbum " + this.appVersion,
291
            },
292
            description: "Uploading " + fileName
293
        };
294

    
295
        var params = [
296
            { name: "login", value: this.base64Encode(this.pseudo) },
297
            { name: "email", value: this.base64Encode(this.email) },
298
            { name: "label", value: this.base64Encode(this.label) },
299
            { name: "legende", value: this.base64Encode(this.legende) },
300
            { name: "album", value: this.base64Encode(this.album) },
301
            { name: "albumPass", value: this.base64Encode(this.albumPass) },
302
            { name: "version", value: "2" },
303
            { name: "fileToUpload", filename: filePath, mimeType: "image/jpeg" }
304
        ];
305
        var task = session.multipartUpload(params, request);
306

    
307
        task.on("progress", logEvent.bind(this));
308
        task.on("error", this.uploadError.bind(this));
309
        task.on("complete", this.uploadCompleted.bind(this));
310
        function logEvent(e) {
311
            console.log("clicalbum: UPLOAD STATUS: " + e.eventName);
312
        }
313
    }
314

    
315
    uploadError(this) {
316
        console.log("clicalbum: UPLOAD ERROR");
317
        dialogs.alert({
318
            title: "Erreur de téléversement",
319
            message: "Pour une raison inconnue le téléversement de votre fichier n'a pas été possible ... si cette erreur persiste merci de nous le signaler via le formulaire de contact disponible sur clicpdf.org",
320
            okButtonText: "Ok"
321
        }).then(() => {
322
            this.enableButtons("btnSendPicture", true)
323
            this.isBusy = false;
324
            console.log("clicalbum: Dialog closed!");
325
        });
326
    }
327

    
328
    uploadCompleted(this) {
329
        console.log("clicalbum: UPLOAD STATUS: terminé");
330
        console.log("clicalbum: UPLOAD STATUS: terminé end");
331
        dialogs.alert({
332
            title: "Téléversement terminé",
333
            message: "Votre document est maintenant sur le serveur",
334
            okButtonText: "Ok"
335
        }).then(() => {
336
            this.isBusy = false;
337
            this.displayImage("");
338
            this.enableButtons("btnSendPicture", false)
339
            console.log("clicalbum: Dialog closed!");
340
        });
341
    }
342

    
343
    saveImage(image, fileName) {
344
        //     // =========== sauvegarde de l'image
345
        if (image.saveToFile(fileName, "jpeg", 95)) {
346
            console.log("clicalbum: Image saved successfully in " + fileName);
347
            this.displayImage(fileName);
348
        }
349
    }
350

    
351
    displayImage(fileName) {
352
        console.log("clicalbum: displayImage  " + fileName);
353
        // if (fileName != "") {
354
            let i = new ImageSource().fromFile(fileName);
355
            this.cameraImage = fileName;
356
        // }
357
        // let i = <Image>getViewById(app.getRootView(), "cameraImage");
358
        // if (i) {
359
        //     console.log("  objet image ok");
360

    
361
        //     if (fileName != "") {
362
        //         i.src = fileName;
363
        //         this.enableButtons("btnSendPicture", true)
364
        //     }
365
        //     else {
366
        //         i.src = "res://icon";
367
        //     }
368
        // }
369

    
370
        this.isBusy = false;
371
        if (fileName != "") {
372
            this.hasPicture = true;
373
        }
374
        else {
375
            this.hasPicture = false;
376
        }
377
        let b = <ActivityIndicator>getViewById(app.getRootView(), "busyIndicator");
378
        if (b) {
379
            console.log("  objet busy ok");
380
            b.busy = false;
381
        }
382

    
383
        console.log("clicalbum: end of displayImage");
384
    }
385

    
386

    
387
    imageCropped(image) {
388
        // this.cameraImage = image;
389
        console.log("imageCropped ...");
390
        console.log("NEW IMAGE: ", image.height, image.width);
391

    
392
        //     // =========== sauvegarde de l'image
393
        const folderPath: string = knownFolders.documents().path;
394
        const fileName = "fichier_temporaire.jpeg";
395
        const filePath = path.join(folderPath, fileName);
396
        this.saveImage(image, filePath)
397
    }
398

    
399
    base64Encode(value) {
400
        console.log("clicalbum: base64 pour " + value);
401
        if (isIOS) {
402
            let text = NSString.stringWithString(value);
403
            let data = text.dataUsingEncoding(NSUTF8StringEncoding);
404
            return data.base64EncodedStringWithOptions(0);
405
        } else {
406
            let text = new java.lang.String(value);
407
            let data = text.getBytes("UTF-8");
408
            return android.util.Base64.encodeToString(data, android.util.Base64.DEFAULT);
409
        }
410
    }
411

    
412
    onBusyChanged(args: EventData) {
413
        let indicator: ActivityIndicator = <ActivityIndicator>args.object;
414
        console.log("clicalbum: indicator.busy changed to: " + indicator.busy);
415
    }
416

    
417
}
Redmine Appliance - Powered by TurnKey Linux