From f43afd3f6c21926cc9996dbd3cd80c0ec2894a61 Mon Sep 17 00:00:00 2001 From: chapoi <101828855+chapoi@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:16:01 +1300 Subject: [PATCH 1/3] DEV: automatic timezone detection + manual override support --- about.json | 14 ++++--- javascripts/components/automatic-timezone.gjs | 25 ++++++++++++ .../api-initializers/automatic-timezone.js | 39 +++++++++++++++++++ .../discourse/api-initializers/todo.js | 5 --- 4 files changed, 72 insertions(+), 11 deletions(-) create mode 100644 javascripts/components/automatic-timezone.gjs create mode 100644 javascripts/discourse/api-initializers/automatic-timezone.js delete mode 100644 javascripts/discourse/api-initializers/todo.js diff --git a/about.json b/about.json index 2f28751..ab2f1fd 100644 --- a/about.json +++ b/about.json @@ -1,13 +1,15 @@ { - "name": "TODO", + "name": "Discourse Automatic Timezone", "component": true, - "authors": "Discourse", - "about_url": "TODO: Put your theme's public repo or Meta topic URL here", - "license_url": "TODO: Put your theme's LICENSE URL here", - "learn_more": "TODO", + "authors": "Chapoi", + "about_url": "", + "license_url": "", + "learn_more": "", "theme_version": "0.0.1", "minimum_discourse_version": null, "maximum_discourse_version": null, - "assets": {}, + "assets": { + "user_custom_fields": ["manually_set_timezone", "last_detected_timezone"] + }, "modifiers": {} } diff --git a/javascripts/components/automatic-timezone.gjs b/javascripts/components/automatic-timezone.gjs new file mode 100644 index 0000000..6debb65 --- /dev/null +++ b/javascripts/components/automatic-timezone.gjs @@ -0,0 +1,25 @@ +// import Component from "@glimmer/component"; +// import { action } from "@ember/object"; +// import { service } from "@ember/service"; +// import { on } from "@ember/modifier"; +// import { modifier } from "@ember/modifier"; + +// export default class AutomaticTimezoneComponent extends Component { +// @service currentUser; + +// checkTimezone = modifier(() => { +// if (!this.currentUser) { +// return; +// } + +// const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; +// if (this.currentUser.timezone !== browserTimezone) { +// this.currentUser.set("timezone", browserTimezone); +// this.currentUser.save(); +// } +// }); + +// +// } diff --git a/javascripts/discourse/api-initializers/automatic-timezone.js b/javascripts/discourse/api-initializers/automatic-timezone.js new file mode 100644 index 0000000..c9f940f --- /dev/null +++ b/javascripts/discourse/api-initializers/automatic-timezone.js @@ -0,0 +1,39 @@ +import { apiInitializer } from "discourse/lib/api"; + +export default apiInitializer("1.14.0", (api) => { + const currentUser = api.getCurrentUser(); + if (!currentUser) { + return; + } + + const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; + + const lastDetectedTimezone = + currentUser.custom_fields?.last_detected_timezone; + const wasManuallySet = + currentUser.custom_fields?.manually_set_timezone === "true"; + + if (!wasManuallySet || browserTimezone !== lastDetectedTimezone) { + currentUser.set("timezone", browserTimezone); + currentUser.set("custom_fields.last_detected_timezone", browserTimezone); + currentUser.set("custom_fields.manually_set_timezone", "false"); + currentUser.save(); + } + + api.modifyClass("controller:preferences/interface", { + pluginId: "auto-timezone", + + actions: { + save() { + if (this.model.timezone !== browserTimezone) { + this.model.set("custom_fields.manually_set_timezone", "true"); + this.model.set( + "custom_fields.last_detected_timezone", + browserTimezone + ); + } + return this._super(...arguments); + }, + }, + }); +}); diff --git a/javascripts/discourse/api-initializers/todo.js b/javascripts/discourse/api-initializers/todo.js deleted file mode 100644 index b78f8da..0000000 --- a/javascripts/discourse/api-initializers/todo.js +++ /dev/null @@ -1,5 +0,0 @@ -import { apiInitializer } from "discourse/lib/api"; - -export default apiInitializer("1.8.0", (/* api */) => { - // console.log("hello world from api initializer!"); -}); From ab07d49a042d7412e5a13f9e44b6831a1c69bfa4 Mon Sep 17 00:00:00 2001 From: chapoi <101828855+chapoi@users.noreply.github.com> Date: Tue, 14 Jan 2025 14:18:20 +1300 Subject: [PATCH 2/3] delete component file --- javascripts/components/automatic-timezone.gjs | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 javascripts/components/automatic-timezone.gjs diff --git a/javascripts/components/automatic-timezone.gjs b/javascripts/components/automatic-timezone.gjs deleted file mode 100644 index 6debb65..0000000 --- a/javascripts/components/automatic-timezone.gjs +++ /dev/null @@ -1,25 +0,0 @@ -// import Component from "@glimmer/component"; -// import { action } from "@ember/object"; -// import { service } from "@ember/service"; -// import { on } from "@ember/modifier"; -// import { modifier } from "@ember/modifier"; - -// export default class AutomaticTimezoneComponent extends Component { -// @service currentUser; - -// checkTimezone = modifier(() => { -// if (!this.currentUser) { -// return; -// } - -// const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; -// if (this.currentUser.timezone !== browserTimezone) { -// this.currentUser.set("timezone", browserTimezone); -// this.currentUser.save(); -// } -// }); - -// -// } From 30966949a0698922c729bd2b9ac80fbc1e1a63fa Mon Sep 17 00:00:00 2001 From: Martin Brennan Date: Tue, 14 Jan 2025 15:17:29 +1000 Subject: [PATCH 3/3] DEV: Use new core API for beforeSave for user profile --- .../api-initializers/automatic-timezone.js | 32 +++++++------------ locales/en.yml | 4 +-- 2 files changed, 12 insertions(+), 24 deletions(-) diff --git a/javascripts/discourse/api-initializers/automatic-timezone.js b/javascripts/discourse/api-initializers/automatic-timezone.js index c9f940f..97de2d7 100644 --- a/javascripts/discourse/api-initializers/automatic-timezone.js +++ b/javascripts/discourse/api-initializers/automatic-timezone.js @@ -6,34 +6,24 @@ export default apiInitializer("1.14.0", (api) => { return; } - const browserTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; - - const lastDetectedTimezone = - currentUser.custom_fields?.last_detected_timezone; + const browserTimezone = moment.tz.guess(); + const lastDetectedTimezone = currentUser.timezone; const wasManuallySet = currentUser.custom_fields?.manually_set_timezone === "true"; if (!wasManuallySet || browserTimezone !== lastDetectedTimezone) { currentUser.set("timezone", browserTimezone); - currentUser.set("custom_fields.last_detected_timezone", browserTimezone); currentUser.set("custom_fields.manually_set_timezone", "false"); - currentUser.save(); + try { + currentUser.save(); + } catch { + currentUser.set("timezone", lastDetectedTimezone); + } } - api.modifyClass("controller:preferences/interface", { - pluginId: "auto-timezone", - - actions: { - save() { - if (this.model.timezone !== browserTimezone) { - this.model.set("custom_fields.manually_set_timezone", "true"); - this.model.set( - "custom_fields.last_detected_timezone", - browserTimezone - ); - } - return this._super(...arguments); - }, - }, + api.registerUserProfileBeforeSaveCallback((userModel) => { + if (userModel.timezone !== browserTimezone) { + userModel.set("custom_fields.manually_set_timezone", "true"); + } }); }); diff --git a/locales/en.yml b/locales/en.yml index 3387fc6..d81d126 100644 --- a/locales/en.yml +++ b/locales/en.yml @@ -1,5 +1,3 @@ en: theme_metadata: - description: "TODO" - settings: - example_setting: "A description of a setting." \ No newline at end of file + description: "Automatically sets the user's timezone based on the current browser timezone" \ No newline at end of file