Status deletion

FossilOrigin-Name: e29e4c081d48cf724df5597e6cb22d9977a47ba91dd1b66921a4ef8b3fd4bc67
This commit is contained in:
nekobit 2022-05-25 07:32:54 +00:00
parent edd88c095d
commit d3e5c4e706
10 changed files with 140 additions and 14 deletions

View file

@ -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

93
dist/js/main.js vendored Normal file
View file

@ -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 = `
<option value="public">Public</option>
<option value="unlisted">Unlisted</option>
<option value="private">Private</option>
<option value="direct">Direct</option>
<option value="local">Local</option>
`.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;
}
})();

View file

@ -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,

View file

@ -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,

View file

@ -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)

View file

@ -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;
}

View file

@ -18,6 +18,7 @@
#ifndef SESSION_H
#define SESSION_H
#include <mastodont.h>
#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

View file

@ -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;

6
static/menu_item.html Normal file
View file

@ -0,0 +1,6 @@
<li>
<form action="%s/status/%s/interact" method="post">
<input type="hidden" name="itype" value="%s">
<input type="submit" class="btn-menu" value="%s">
</form>
</li>

View file

@ -31,6 +31,7 @@
<input type="submit" class="btn-menu" value="%s">
</form>
</li>
%s
</ul>
</div>
</div>