Tabs and blocked message

FossilOrigin-Name: 252a9d37f97358e4b6d3e7a571784b3be0647461d6aa256e992a3c8f7e67942f
This commit is contained in:
me@ow.nekobit.net 2022-04-06 14:30:14 +00:00
parent 77fd533943
commit c00cf74f6d
11 changed files with 116 additions and 21 deletions

55
dist/treebird20.css vendored
View file

@ -172,15 +172,29 @@ table.present th, table.present td
margin-top: 5px;
}
.error
.e-error
{
display: block;
border-radius: 4px;
background-color: #fcb0b0;
color: #000;
border: 1px solid #bb1c1f;
padding: 15px;
font-weight: bold;
}
.error-pad
{
margin: 5px;
border-radius: 4px;
}
.e-notice
{
display: block;
background-color: #ddeeff;
color: #000;
border: 1px solid #66ccff;
padding: 15px;
font-weight: bold;
}
@ -191,7 +205,7 @@ table.present th, table.present td
{
background: linear-gradient(#fff, #f7f7f7);
color: #000;
text-decoration: none;
text-decoration: none;
}
.sidebarbtn:hover, .btn:hover
@ -673,6 +687,7 @@ svg.in-reply-to-icon
.account-note
{
word-break: break-all;
text-align: center;
}
.account-info
@ -681,7 +696,7 @@ svg.in-reply-to-icon
color: #000;
padding: 15px 50px;
border-bottom: 1px solid #cacaca;
max-height: 200px;
max-height: 360px;
overflow: auto;
}
@ -986,27 +1001,51 @@ ul.large-list li a
}
/* Navigation */
.navigation
.navigation,
.tabs
{
table-layout: fixed;
background-color: #eaeaea;
background-color: #f3f3f3;
color: #000;
width: 100%;
border-spacing: 0px;
box-shadow: 0px 1px 0px #dadada;
}
.navigation .nav-btn
.navigation .nav-btn,
.tabs .tab-btn
{
display: block;
padding: 8px !important;
}
.navigation tr td:not(:last-child)
.tabs .tab-btn
{
width: 100%;
border: 0;
}
.tabs .tab-btn.focused
{
border-bottom: 3px solid #aa0000;
}
.tabs .tab-btn:hover,
.tabs .tab-btn:active
{
border-bottom: 3px solid #600000;
}
.navigation tr td:not(:last-child),
.tabs tr td:not(:last-child)
{
border-right: 1px solid #dadada;
}
.ui-table tr td a
{
text-decoration: none;
}
/* MENUS */

View file

@ -58,6 +58,7 @@ char* construct_account_page(mastodont_t* api,
char* statuses_html;
char* follows_you = NULL;
char* info_html = NULL;
char* is_blocked = NULL;
char* result;
// Load statuses html
@ -72,12 +73,17 @@ char* construct_account_page(mastodont_t* api,
info_html = construct_account_info(acct, NULL);
}
if (relationship)
if (relationship)
{
if (MSTDNT_FLAG_ISSET(relationship->flags, MSTDNT_RELATIONSHIP_FOLLOWED_BY))
easprintf(&follows_you, FOLLOWS_YOU_HTML, "Follows you");
if (MSTDNT_FLAG_ISSET(relationship->flags, MSTDNT_RELATIONSHIP_BLOCKED_BY))
is_blocked = construct_error("You are blocked by this user", E_NOTE, 0, NULL);
}
result_size = easprintf(&result, data_account_html,
"",
is_blocked ? is_blocked : "",
acct->header,
follows_you ? follows_you : "",
acct->display_name,
@ -104,6 +110,18 @@ char* construct_account_page(mastodont_t* api,
!relationship ? "" : MSTDNT_FLAG_ISSET(relationship->flags, MSTDNT_RELATIONSHIP_FOLLOWING) ? "Following!" : "Follow",
acct->avatar,
info_html ? info_html : "",
config_url_prefix,
acct->acct,
"Statuses",
config_url_prefix,
acct->acct,
"Scrobbles",
config_url_prefix,
acct->acct,
"Media",
config_url_prefix,
acct->acct,
"Pinned",
statuses_html);
if (result_size == -1)
@ -113,6 +131,7 @@ char* construct_account_page(mastodont_t* api,
if (cleanup) free(statuses_html);
if (info_html) free(info_html);
if (follows_you) free(follows_you);
if (is_blocked) free(is_blocked);
return result;
}
@ -132,7 +151,7 @@ void content_account(struct session* ssn, mastodont_t* api, char** data)
mastodont_get_account_statuses(api, acct.id, NULL,
&status_storage, &statuses, &status_len))
{
account_page = construct_error(status_storage.error, NULL);
account_page = construct_error(status_storage.error, E_ERROR, 1, NULL);
}
else {
/* Not an error? */

View file

@ -25,10 +25,23 @@
#include "../static/error_404.chtml"
#include "../static/error.chtml"
char* construct_error(char* error, size_t* size)
char* construct_error(char* error, enum error_type type, unsigned pad, size_t* size)
{
char* error_html;
char* class;
switch (type)
{
case E_ERROR:
class = "error"; break;
case E_WARNING:
class = "warning"; break;
case E_NOTE:
class = "notice"; break;
}
size_t s = easprintf(&error_html, data_error_html,
class,
pad ? "error-pad" : "",
error);
if (size) *size = s;
return error_html;

View file

@ -22,7 +22,14 @@
#include <stddef.h>
#include "session.h"
char* construct_error(char* message, size_t* size);
enum error_type
{
E_ERROR,
E_WARNING,
E_NOTE
};
char* construct_error(char* error, enum error_type type, unsigned pad, size_t* size);
void content_not_found(struct session* ssn, mastodont_t* api, char* path);
#endif // ERROR_H

View file

@ -72,7 +72,7 @@ void content_lists(struct session* ssn, mastodont_t* api, char** data)
if (mastodont_get_lists(api, &lists, &storage, &size_list))
{
lists_page = construct_error(storage.error, NULL);
lists_page = construct_error(storage.error, E_ERROR, 1, NULL);
}
else {
lists_format = construct_lists(lists, size_list, NULL);

View file

@ -52,7 +52,7 @@ void content_login(struct session* ssn, mastodont_t* api, char** data)
if (mastodont_register_app(api, &args_app, &storage, &app) != 0)
{
error = construct_error(oauth_store.error, NULL);
error = construct_error(oauth_store.error, E_ERROR, 1, NULL);
}
else {
struct mstdnt_args args_token = {
@ -69,7 +69,7 @@ void content_login(struct session* ssn, mastodont_t* api, char** data)
if (mastodont_obtain_oauth_token(api, &args_token, &oauth_store,
&token) != 0)
{
error = construct_error(oauth_store.error, NULL);
error = construct_error(oauth_store.error, E_ERROR, 1, NULL);
}
else {
printf("Set-Cookie: access_token=%s; Path=/; Max-Age=31536000\r\n", token.access_token);

View file

@ -185,7 +185,7 @@ void content_notifications(struct session* ssn, mastodont_t* api, char** data)
mstdnt_cleanup_notifications(notifs, notifs_len);
}
else
notif_html = construct_error(storage.error, NULL);
notif_html = construct_error(storage.error, E_NOTE, 1, NULL);
}

View file

@ -327,7 +327,7 @@ void content_status(struct session* ssn, mastodont_t* api, char** data, int is_r
// Get information
if (mastodont_get_status(api, data[0], &status_storage, &status))
{
stat_html = construct_error("Status not found", NULL);
stat_html = construct_error("Status not found", E_ERROR, 1, NULL);
}
else {
before_html = construct_statuses(api, statuses_before, stat_before_len, NULL);

View file

@ -56,7 +56,7 @@ void tl_public(struct session* ssn, mastodont_t* api, int local)
if (mastodont_timeline_public(api, &args, &storage, &statuses, &status_count))
{
status_format = construct_error(storage.error, NULL);
status_format = construct_error(storage.error, E_ERROR, 1, NULL);
}
else {
// Construct statuses into HTML

View file

@ -1,5 +1,5 @@
%s
<div class="account">
%s
<div class="acct-banner" style="background-image:url('%s');">
%s
<div class="acct-info-data">
@ -44,6 +44,23 @@
%s
<table class="tabs ui-table">
<tr>
<td>
<a href="%s/@%s/statuses"><input class="tab-btn btn focused" type="button" value="%s"></a>
</td>
<td>
<a href="%s/@%s/scrobbles"><input class="tab-btn btn" type="button" value="%s"></a>
</td>
<td>
<a href="%s/@%s/media"><input class="tab-btn btn" type="button" value="%s"></a>
</td>
<td>
<a href="%s/@%s/pinned"><input class="tab-btn btn" type="button" value="%s"></a>
</td>
</tr>
</table>
<div class="account-content">
%s
</div>

View file

@ -1 +1 @@
<span class="error">%s</span>
<span class="e-%s %s">%s</span>