diff --git a/js/main.js b/js/main.js
index c273c76..9c6c46f 100644
--- a/js/main.js
+++ b/js/main.js
@@ -1,9 +1,9 @@
let DAMUS = new_model();
// TODO autogenerate these constants with a bash script
-const IMG_EVENT_LIKED = "icon/event-liked.svg";
-const IMG_EVENT_LIKE = "icon/event-like.svg";
-const IMG_NO_USER = "icon/no-user.svg";
+const IMG_EVENT_LIKED = "/icon/event-liked.svg";
+const IMG_EVENT_LIKE = "/icon/event-like.svg";
+const IMG_NO_USER = "/icon/no-user.svg";
const SID_META = "meta";
const SID_HISTORY = "history";
@@ -103,10 +103,10 @@ async function webapp_init() {
model_process_event(model, undefined, ev);
});
log_debug("loaded events", Object.keys(model.all_events).length);
+ */
- // Update our view and apply timer methods once all data is ready to go.
- view_timeline_update(model);*/
- view_timeline_apply_mode(model, VM_FRIENDS, {hide_replys: true});
+ var { mode, opts, valid } = parse_url_mode();
+ view_timeline_apply_mode(model, mode, opts, !valid);
on_timer_timestamps();
on_timer_invalidations();
on_timer_save();
@@ -115,6 +115,36 @@ async function webapp_init() {
return pool;
}
+function parse_url_mode() {
+ var mode;
+ var valid = true;
+ var opts = {};
+ var parts = window.location.pathname.split("/").slice(1);
+ for (var key in VIEW_NAMES) {
+ if (VIEW_NAMES[key].toLowerCase() == parts[0]) {
+ mode = key;
+ break;
+ }
+ }
+ if (!mode) {
+ mode = VM_FRIENDS;
+ valid = false;
+ }
+ switch (mode) {
+ case VM_FRIENDS:
+ opts.hide_replys = true;
+ break;
+ case VM_THREAD:
+ opts.thread_id = parts[1];
+ break;
+ case VM_DM_THREAD:
+ case VM_USER:
+ opts.pubkey = parts[1];
+ break;
+ }
+ return { mode, opts, valid };
+}
+
function on_timer_timestamps() {
setTimeout(() => {
view_timeline_update_timestamps();
diff --git a/js/ui/render.js b/js/ui/render.js
index e811b3a..6ce77e2 100644
--- a/js/ui/render.js
+++ b/js/ui/render.js
@@ -198,7 +198,7 @@ function render_action_bar(model, ev, opts={}) {
if (!shared && event_can_reply(ev)) {
str += html`
`;
}
str += `
`;
if (can_delete) {
const delete_id = shared ? shared.share_evid : ev.id;
str += html`
`
}
return str + "
";
diff --git a/js/ui/state.js b/js/ui/state.js
index 37b0bb0..d5d15b8 100644
--- a/js/ui/state.js
+++ b/js/ui/state.js
@@ -7,6 +7,16 @@ const VM_THREAD = "thread"; // all events in response to target event
const VM_USER = "user"; // all events by pubkey
const VM_SETTINGS = "settings";
+const VIEW_NAMES= {};
+VIEW_NAMES[VM_FRIENDS] = "Home";
+VIEW_NAMES[VM_EXPLORE] = "Explore";
+VIEW_NAMES[VM_NOTIFICATIONS] = "Notifications";
+VIEW_NAMES[VM_DM] = "Messages";
+VIEW_NAMES[VM_DM_THREAD] = "DM";
+VIEW_NAMES[VM_USER] = "Profile";
+VIEW_NAMES[VM_THREAD] = "Thread";
+VIEW_NAMES[VM_SETTINGS] = "Settings";
+
function view_get_timeline_el() {
return find_node("#timeline");
}
@@ -48,10 +58,6 @@ function view_timeline_apply_mode(model, mode, opts={}, push_state=true) {
}
}
- // Push a new state to the browser history stack
- if (push_state)
- history.pushState({mode, opts}, '');
-
// Fetch history for certain views
if (mode == VM_THREAD) {
view_show_spinner(true);
@@ -65,18 +71,28 @@ function view_timeline_apply_mode(model, mode, opts={}, push_state=true) {
reset_notifications(model);
}
- const names = {};
- names[VM_FRIENDS] = "Home";
- names[VM_EXPLORE] = "Explore";
- names[VM_NOTIFICATIONS] = "Notifications";
- names[VM_DM] = "Messages";
- names[VM_DM_THREAD] = "Messages";
- names[VM_USER] = "Profile";
- names[VM_THREAD] = "Thread";
- names[VM_SETTINGS] = "Settings";
+ const names = VIEW_NAMES;
let name = names[mode];
let profile;
+ // Push a new state to the browser history stack
+ if (push_state) {
+ let pieces = [name.toLowerCase()];
+ switch (mode) {
+ case VM_FRIENDS:
+ pieces = [];
+ break;
+ case VM_THREAD:
+ pieces.push(thread_id);
+ break;
+ case VM_USER:
+ case VM_DM_THREAD:
+ pieces.push(pubkey);
+ break;
+ }
+ history.pushState({mode, opts}, "", "/"+pieces.join("/"));
+ }
+
el.dataset.mode = mode;
delete el.dataset.threadId;
delete el.dataset.pubkey;