diff --git a/Makefile b/Makefile index e3332a6..5e37c5c 100644 --- a/Makefile +++ b/Makefile @@ -62,6 +62,8 @@ $(PAGES_DIR)/emoji_reactions.chtml: $(PAGES_DIR)/emoji_reactions.html ./filec $< data_emoji_reactions_html > $@ $(PAGES_DIR)/emoji_reaction.chtml: $(PAGES_DIR)/emoji_reaction.html ./filec $< data_emoji_reaction_html > $@ +$(PAGES_DIR)/menu_item.chtml: $(PAGES_DIR)/menu_item.html + ./filec $< data_menu_item_html > $@ $(PAGES_DIR)/test.chtml: $(PAGES_DIR)/test.html ./filec $< data_test_html > $@ $(PAGES_DIR)/notifications_page.chtml: $(PAGES_DIR)/notifications_page.html diff --git a/dist/js/main.js b/dist/js/main.js new file mode 100644 index 0000000..4e77a14 --- /dev/null +++ b/dist/js/main.js @@ -0,0 +1,93 @@ +Element.prototype.insertAfter = function(element) { + element.parentNode.insertBefore(this, element.nextSibling); +}; + +function construct_quick_reply_form(replyid) +{ + let src = document.createElement("form"); + src.action = "/status/create"; + src.method = "post"; + src.enctype = "multipart/form-data"; + src.className = "statusbox-quickreply"; + let hiddeninput = document.createElement("input"); + hiddeninput.type = "hidden"; + hiddeninput.name = "replyid" + hiddeninput.value = replyid; + let statusbox = document.createElement("div"); + statusbox.className = "statusbox statusbox-ani"; + + let textarea = document.createElement("textarea"); + textarea.placeholder = "Just landed in N.Y."; + textarea.rows = 5; + textarea.tabindex = 1; + textarea.name = "content"; + + let statusfooter = document.createElement("div"); + statusfooter.className = "statusfooter"; + let statusfooter_sides = { + left: document.createElement("div"), + right: document.createElement("div"), + } + let select = document.createElement("select"); + let files_input = document.createElement("input"); + statusfooter_sides.left.className = "statusfooter-left"; + select.innerHTML = ` + + + + + + `.trim(); + files_input.type = "file"; + files_input.name = "file"; + files_input.tabindex = 4; + files_input.multiple = ""; + + statusfooter_sides.right.className = "statusfooter-right"; + let submitbtn = document.createElement("input"); + submitbtn.className = "btn post-btn"; + submitbtn.type = "submit"; + submitbtn.value = "Post"; + submitbtn.tabindex = 2; + + + statusfooter_sides.left.appendChild(select); + statusfooter_sides.left.appendChild(files_input); + statusfooter_sides.right.appendChild(submitbtn); + statusfooter.appendChild(statusfooter_sides.left); + statusfooter.appendChild(statusfooter_sides.right); + statusbox.appendChild(textarea); + statusbox.appendChild(statusfooter); + src.appendChild(hiddeninput); + src.appendChild(statusbox); + return src; +} + +function create_reply_form(e) +{ + e.preventDefault(); + let status = e.target.closest(".status"); + + if (status.nextSibling.className === "statusbox-quickreply") + { + status.nextSibling.remove(); + } + else { + let form = construct_quick_reply_form(status.id); + form.insertAfter(status); + + } + + + return false; +} + +// Main +(function() { + let reply_btn = document.getElementsByClassName("reply-btn"); + + for (let i = 0; i < reply_btn.length; ++i) + { + reply_btn[i].onclick = create_reply_form; + } +})(); diff --git a/src/account.c b/src/account.c index 1dfcc0d..32a045d 100644 --- a/src/account.c +++ b/src/account.c @@ -157,6 +157,13 @@ static char* account_scrobbles_cb(struct session* ssn, mastodont_t* api, struct return scrobbles_html; } +void get_account_info(mastodont_t* api, struct session* ssn) +{ + if (mastodont_verify_credentials(api, &(ssn->acct), &(ssn->acct_storage)) == 0) + { + ssn->logged_in = 1; + } +} static void fetch_account_page(struct session* ssn, mastodont_t* api, diff --git a/src/account.h b/src/account.h index 71eba04..c6e753c 100644 --- a/src/account.h +++ b/src/account.h @@ -53,7 +53,7 @@ struct account_page struct mstdnt_relationship* relationship; }; - +void get_account_info(mastodont_t* api, struct session* ssn); char* construct_account_sidebar(struct mstdnt_account* acct, size_t* size); char* construct_account(mastodont_t* api, diff --git a/src/base_page.c b/src/base_page.c index 1569224..09d892f 100644 --- a/src/base_page.c +++ b/src/base_page.c @@ -47,7 +47,6 @@ void render_base_page(struct base_page* page, struct session* ssn, mastodont_t* * main_sidebar_str = NULL, * account_sidebar_str = NULL; // Mastodont, used for notifications sidebar - struct mstdnt_account acct = { 0 }; struct mstdnt_storage storage = { 0 }; struct mstdnt_notification* notifs = NULL; size_t notifs_len = 0; @@ -63,12 +62,7 @@ void render_base_page(struct base_page* page, struct session* ssn, mastodont_t* // If user is logged in if (keystr(ssn->cookies.logged_in) && keystr(ssn->cookies.access_token)) { - if (mastodont_verify_credentials(api, &acct, &storage) == 0) - { - account_sidebar_str = construct_account_sidebar(&acct, NULL); - } - mstdnt_cleanup_account(&acct); - mastodont_storage_cleanup(&storage); // reuse it later + account_sidebar_str = construct_account_sidebar(&(ssn->acct), NULL); // Get / Show notifications on sidebar if (ssn->config.notif_embed) diff --git a/src/main.c b/src/main.c index 3d918b1..783866f 100644 --- a/src/main.c +++ b/src/main.c @@ -120,7 +120,10 @@ int main(void) }, .cookies = {{}}, .post = {{}}, - .query = {{}} + .query = {{}}, + .acct = { 0 }, + .acct_storage = { 0 }, + .logged_in = 0, }; // Load cookies @@ -139,6 +142,9 @@ int main(void) // Read config options load_config(&ssn, &api); + // Load current account information + get_account_info(&api, &ssn); + handle_paths(&ssn, &api, paths, sizeof(paths)/sizeof(paths[0])); // Cleanup @@ -146,6 +152,8 @@ int main(void) if (post_str) free(post_str); if (get_str) free(get_str); free_files(&(keyfile(ssn.post.files))); + if (ssn.logged_in) mstdnt_cleanup_account(&(ssn.acct)); + mastodont_storage_cleanup(&(ssn.acct_storage)); ++run_count; } diff --git a/src/session.h b/src/session.h index c2b6200..47604bd 100644 --- a/src/session.h +++ b/src/session.h @@ -18,6 +18,7 @@ #ifndef SESSION_H #define SESSION_H +#include #include "query.h" #include "local_config.h" #include "cookie.h" @@ -28,6 +29,9 @@ struct session struct get_values query; struct cookie_values cookies; struct local_config config; + int logged_in; + struct mstdnt_account acct; + struct mstdnt_storage acct_storage; }; #endif // SESSION_H diff --git a/src/status.c b/src/status.c index 3f68c6f..9a02892 100644 --- a/src/status.c +++ b/src/status.c @@ -45,6 +45,7 @@ #include "../static/likeboost.chtml" #include "../static/reactions_btn.chtml" #include "../static/interaction_buttons.chtml" +#include "../static/menu_item.chtml" #define ACCOUNT_INTERACTIONS_LIMIT 11 #define NUM_STR "%u" @@ -149,6 +150,8 @@ int try_interact_status(struct session* ssn, mastodont_t* api, char* id) mastodont_pin_status(api, id, &storage, NULL); else if (strcmp(keystr(ssn->post.itype), "mute") == 0) mastodont_mute_conversation(api, id, &storage, NULL); + else if (strcmp(keystr(ssn->post.itype), "delete") == 0) + mastodont_delete_status(api, id, &storage, NULL); else if (strcmp(keystr(ssn->post.itype), "unlike") == 0) mastodont_unfavourite_status(api, id, &storage, NULL); else if (strcmp(keystr(ssn->post.itype), "unrepeat") == 0) @@ -479,6 +482,7 @@ char* construct_status(struct session* ssn, char* interaction_btns = NULL; char* notif_info = NULL; char* in_reply_to_str = NULL; + char* delete_status = NULL; char* interactions_html = NULL; struct mstdnt_status* status = local_status; // Create a "fake" notification header which contains information for @@ -555,6 +559,11 @@ char* construct_status(struct session* ssn, free(repl_str); } + + // Delete status menu item, logged in only + if (strcmp(status->account.acct, ssn->acct.acct) == 0) + easprintf(&delete_status, data_menu_item_html, + config_url_prefix, status->id, "delete", "Delete status"); if (status->media_attachments_len) attachments = construct_attachments(ssn, status->sensitive, status->media_attachments, status->media_attachments_len, NULL); @@ -595,6 +604,7 @@ char* construct_status(struct session* ssn, status->id, status->bookmarked ? "un" : "", status->bookmarked ? "Remove Bookmark" : "Bookmark", + delete_status ? delete_status : "", in_reply_to_str ? in_reply_to_str : "", parse_content, attachments ? attachments : "", @@ -606,12 +616,13 @@ char* construct_status(struct session* ssn, // Cleanup if (formatted_display_name != status->account.display_name && formatted_display_name) free(formatted_display_name); - if (interaction_btns) free(interaction_btns); - if (in_reply_to_str) free(in_reply_to_str); - if (attachments) free(attachments); - if (emoji_reactions) free(emoji_reactions); + free(interaction_btns); + free(in_reply_to_str); + free(attachments); + free(emoji_reactions); if (notif) free(notif_info); - if (interactions_html) free(interactions_html); + free(delete_status); + free(interactions_html); if (parse_content != status->content && parse_content) free(parse_content); return stat_html; diff --git a/static/menu_item.html b/static/menu_item.html new file mode 100644 index 0000000..b06b776 --- /dev/null +++ b/static/menu_item.html @@ -0,0 +1,6 @@ +
  • +
    + + +
    +
  • diff --git a/static/status.html b/static/status.html index 0935a55..0c8c5f7 100644 --- a/static/status.html +++ b/static/status.html @@ -31,6 +31,7 @@ + %s