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