From c94c319225d2fc1b911efaed8c72cc300bf72085 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Thu, 5 Dec 2019 17:18:44 +0100
Subject: [PATCH 1/3] MOBILE-3201 log: Delete logs if WS call fails

---
 src/addon/mod/data/components/index/index.ts |  2 +-
 src/core/course/providers/log-helper.ts      | 22 ++++++++++++++++----
 2 files changed, 19 insertions(+), 5 deletions(-)

diff --git a/src/addon/mod/data/components/index/index.ts b/src/addon/mod/data/components/index/index.ts
index ecdd5064e..0b3e22870 100644
--- a/src/addon/mod/data/components/index/index.ts
+++ b/src/addon/mod/data/components/index/index.ts
@@ -124,7 +124,7 @@ export class AddonModDataIndexComponent extends CoreCourseModuleMainActivityComp
         this.selectedGroup = this.group || 0;
 
         this.loadContent(false, true).then(() => {
-            if (!this.data) {
+            if (!this.data || !this.data.id) {
                 return;
             }
 
diff --git a/src/core/course/providers/log-helper.ts b/src/core/course/providers/log-helper.ts
index f2319aad3..8792eab81 100644
--- a/src/core/course/providers/log-helper.ts
+++ b/src/core/course/providers/log-helper.ts
@@ -185,14 +185,17 @@ export class CoreCourseLogHelperProvider {
      */
     protected logOnline(ws: string, data: any, siteId?: string): Promise<any> {
         return this.sitesProvider.getSite(siteId).then((site) => {
-            return site.write(ws, data).then((response) => {
+            // Clone to have an unmodified data object.
+            const wsData = Object.assign({}, data);
+
+            return site.write(ws, wsData).then((response) => {
                 if (!response.status) {
                     return Promise.reject(this.utils.createFakeWSError(''));
                 }
 
                 // Remove all the logs performed.
                 // TODO: Remove this lines when time is accepted in logs.
-                return this.deleteWSLogs(ws, data);
+                return this.deleteWSLogs(ws, data, siteId);
             });
         });
     }
@@ -335,8 +338,19 @@ export class CoreCourseLogHelperProvider {
      */
     protected syncLogs(logs: any[], siteId: string): Promise<any> {
         return Promise.all(logs.map((log) => {
-            return this.logOnline(log.ws, this.textUtils.parseJSON(log.data), siteId).then(() => {
-                return this.deleteWSLogsByComponent(log.component, log.componentid, log.ws);
+            const data = this.textUtils.parseJSON(log.data);
+
+            return this.logOnline(log.ws, data, siteId).catch((error) => {
+                const promise = this.utils.isWebServiceError(error) ? this.deleteWSLogs(log.ws, data, siteId) : Promise.resolve();
+
+                return promise.catch(() => {
+                    // Ignore errors.
+                }).then(() => {
+                    // The WebService has thrown an error, this means that responses cannot be submitted.
+                    return Promise.reject(error);
+                });
+            }).then(() => {
+                return this.deleteWSLogsByComponent(log.component, log.componentid, log.ws, siteId);
             });
         }));
     }

From b4f563282bfee1b8b0aa299aa4fbeebddacadd25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Mon, 9 Dec 2019 11:32:42 +0100
Subject: [PATCH 2/3] MOBILE-3201 libs: Fix sortProperties null object error

---
 src/providers/utils/utils.ts | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/providers/utils/utils.ts b/src/providers/utils/utils.ts
index 31834a365..4f71eede7 100644
--- a/src/providers/utils/utils.ts
+++ b/src/providers/utils/utils.ts
@@ -1252,7 +1252,7 @@ export class CoreUtilsProvider {
      * @return Sorted object.
      */
     sortProperties(obj: object): object {
-        if (typeof obj == 'object' && !Array.isArray(obj)) {
+        if (obj != null && typeof obj == 'object' && !Array.isArray(obj)) {
             // It's an object, sort it.
             return Object.keys(obj).sort().reduce((accumulator, key) => {
                 // Always call sort with the value. If it isn't an object, the original value will be returned.

From 07873688723b5bf8c77b035700e5b0acf5e3a548 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= <crazyserver@gmail.com>
Date: Thu, 5 Dec 2019 16:54:33 +0100
Subject: [PATCH 3/3] MOBILE-3201 wiki: Fix wiki page log

---
 src/addon/mod/wiki/components/index/index.scss |  2 +-
 src/addon/mod/wiki/components/index/index.ts   | 12 +++++++-----
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/src/addon/mod/wiki/components/index/index.scss b/src/addon/mod/wiki/components/index/index.scss
index e7edc2e28..4e4fcb283 100644
--- a/src/addon/mod/wiki/components/index/index.scss
+++ b/src/addon/mod/wiki/components/index/index.scss
@@ -13,7 +13,7 @@ ion-app.app-root addon-mod-wiki-index {
     .addon-mod_wiki-page-content {
         background-color: $white;
         border-top: 1px solid $gray;
-        @include safe-area-padding-horizontal(0px, 0px);
+        @include safe-area-padding-horizontal(10px, 10px);
         @include darkmode() {
             background-color: $black;
         }
diff --git a/src/addon/mod/wiki/components/index/index.ts b/src/addon/mod/wiki/components/index/index.ts
index 5bb22176e..f72447642 100644
--- a/src/addon/mod/wiki/components/index/index.ts
+++ b/src/addon/mod/wiki/components/index/index.ts
@@ -99,14 +99,14 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
                 return;
             }
 
-            if (this.isMainPage) {
+            if (!this.pageId) {
                 this.wikiProvider.logView(this.wiki.id, this.wiki.name).then(() => {
                     this.courseProvider.checkModuleCompletion(this.courseId, this.module.completiondata);
                 }).catch((error) => {
                     // Ignore errors.
                 });
             } else {
-                this.wikiProvider.logPageView(this.pageId, this.wiki.id, this.wiki.name).catch(() => {
+                this.wikiProvider.logPageView(this.pageId, this.wiki.id, this.wiki.name).catch((error) => {
                     // Ignore errors.
                 });
             }
@@ -280,9 +280,11 @@ export class AddonModWikiIndexComponent extends CoreCourseModuleMainActivityComp
                             this.currentPage = data.pageId;
 
                             this.showLoadingAndFetch(true, false).then(() => {
-                                this.wikiProvider.logPageView(this.currentPage, this.wiki.id, this.wiki.name).catch(() => {
-                                    // Ignore errors.
-                                });
+                                if (this.currentPage) {
+                                    this.wikiProvider.logPageView(this.currentPage, this.wiki.id, this.wiki.name).catch(() => {
+                                        // Ignore errors.
+                                    });
+                                }
                             });
 
                             // Stop listening for new page events.