summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFilip785 <fdjuricic98@gmail.com>2020-07-08 02:28:47 +0200
committerFilip785 <fdjuricic98@gmail.com>2020-07-08 02:28:47 +0200
commit68e9755e593bbd8230eab2a123e822022721f071 (patch)
treeae11c818f1678ab1780ab95872ecc68cc9114af4
parent8fda7d00d5ec9e415b44aa10cff3c4d735563a20 (diff)
Add cake day display in user page & posts/comments #682
-rw-r--r--server/migrations/2020-06-30-135809_remove_mat_views/up.sql2
-rw-r--r--server/src/db/comment_view.rs7
-rw-r--r--server/src/db/post_view.rs5
-rw-r--r--ui/src/components/cake-day.tsx41
-rw-r--r--ui/src/components/comment-node.tsx8
-rw-r--r--ui/src/components/post-listing.tsx9
-rw-r--r--ui/src/components/symbols.tsx3
-rw-r--r--ui/src/components/user.tsx10
-rw-r--r--ui/src/interfaces.ts2
-rw-r--r--ui/translations/en.json4
10 files changed, 90 insertions, 1 deletions
diff --git a/server/migrations/2020-06-30-135809_remove_mat_views/up.sql b/server/migrations/2020-06-30-135809_remove_mat_views/up.sql
index bd792a8b..9e2fa59c 100644
--- a/server/migrations/2020-06-30-135809_remove_mat_views/up.sql
+++ b/server/migrations/2020-06-30-135809_remove_mat_views/up.sql
@@ -106,6 +106,7 @@ select
u.actor_id as creator_actor_id,
u."local" as creator_local,
u."name" as creator_name,
+ u.published as creator_published,
u.avatar as creator_avatar,
u.banned as banned,
cb.id::bool as banned_from_community,
@@ -490,6 +491,7 @@ select
u.actor_id as creator_actor_id,
u.local as creator_local,
u.name as creator_name,
+ u.published as creator_published,
u.avatar as creator_avatar,
-- score details
coalesce(cl.total, 0) as score,
diff --git a/server/src/db/comment_view.rs b/server/src/db/comment_view.rs
index d1b27a3c..75ed4cb7 100644
--- a/server/src/db/comment_view.rs
+++ b/server/src/db/comment_view.rs
@@ -28,6 +28,7 @@ table! {
creator_local -> Bool,
creator_name -> Varchar,
creator_avatar -> Nullable<Text>,
+ creator_published -> Timestamp,
score -> BigInt,
upvotes -> BigInt,
downvotes -> BigInt,
@@ -63,6 +64,7 @@ table! {
creator_local -> Bool,
creator_name -> Varchar,
creator_avatar -> Nullable<Text>,
+ creator_published -> Timestamp,
score -> BigInt,
upvotes -> BigInt,
downvotes -> BigInt,
@@ -101,6 +103,7 @@ pub struct CommentView {
pub creator_local: bool,
pub creator_name: String,
pub creator_avatar: Option<String>,
+ pub creator_published: chrono::NaiveDateTime,
pub score: i64,
pub upvotes: i64,
pub downvotes: i64,
@@ -314,6 +317,7 @@ table! {
creator_local -> Bool,
creator_name -> Varchar,
creator_avatar -> Nullable<Text>,
+ creator_published -> Timestamp,
score -> BigInt,
upvotes -> BigInt,
downvotes -> BigInt,
@@ -353,6 +357,7 @@ pub struct ReplyView {
pub creator_local: bool,
pub creator_name: String,
pub creator_avatar: Option<String>,
+ pub creator_published: chrono::NaiveDateTime,
pub score: i64,
pub upvotes: i64,
pub downvotes: i64,
@@ -576,6 +581,7 @@ mod tests {
published: inserted_comment.published,
updated: None,
creator_name: inserted_user.name.to_owned(),
+ creator_published: inserted_user.published,
creator_avatar: None,
score: 1,
downvotes: 0,
@@ -609,6 +615,7 @@ mod tests {
published: inserted_comment.published,
updated: None,
creator_name: inserted_user.name.to_owned(),
+ creator_published: inserted_user.published,
creator_avatar: None,
score: 1,
downvotes: 0,
diff --git a/server/src/db/post_view.rs b/server/src/db/post_view.rs
index 808cf28c..cda5cecf 100644
--- a/server/src/db/post_view.rs
+++ b/server/src/db/post_view.rs
@@ -28,6 +28,7 @@ table! {
creator_actor_id -> Text,
creator_local -> Bool,
creator_name -> Varchar,
+ creator_published -> Timestamp,
creator_avatar -> Nullable<Text>,
banned -> Bool,
banned_from_community -> Bool,
@@ -75,6 +76,7 @@ table! {
creator_actor_id -> Text,
creator_local -> Bool,
creator_name -> Varchar,
+ creator_published -> Timestamp,
creator_avatar -> Nullable<Text>,
banned -> Bool,
banned_from_community -> Bool,
@@ -125,6 +127,7 @@ pub struct PostView {
pub creator_actor_id: String,
pub creator_local: bool,
pub creator_name: String,
+ pub creator_published: chrono::NaiveDateTime,
pub creator_avatar: Option<String>,
pub banned: bool,
pub banned_from_community: bool,
@@ -499,6 +502,7 @@ mod tests {
body: None,
creator_id: inserted_user.id,
creator_name: user_name.to_owned(),
+ creator_published: inserted_user.published,
creator_avatar: None,
banned: false,
banned_from_community: false,
@@ -548,6 +552,7 @@ mod tests {
stickied: false,
creator_id: inserted_user.id,
creator_name: user_name,
+ creator_published: inserted_user.published,
creator_avatar: None,
banned: false,
banned_from_community: false,
diff --git a/ui/src/components/cake-day.tsx b/ui/src/components/cake-day.tsx
new file mode 100644
index 00000000..67ac7f8b
--- /dev/null
+++ b/ui/src/components/cake-day.tsx
@@ -0,0 +1,41 @@
+import { Component } from 'inferno';
+import moment from 'moment';
+import { i18n } from '../i18next';
+
+interface CakeDayProps {
+ creator_name: string;
+ creator_published: string;
+}
+
+export class CakeDay extends Component<CakeDayProps, any> {
+ render() {
+ const { creator_name, creator_published } = this.props;
+
+ return (
+ this.isCakeDay(creator_published) && (
+ <div
+ className="mr-lg-2 d-inline-block unselectable pointer mx-2"
+ data-tippy-content={this.cakeDayTippy(creator_name)}
+ >
+ <svg class="icon icon-inline">
+ <use xlinkHref="#icon-cake"></use>
+ </svg>
+ </div>
+ )
+ );
+ }
+
+ isCakeDay(input: string): boolean {
+ const userCreationDate = moment.utc(input).local();
+ const currentDate = moment(new Date());
+
+ return (
+ userCreationDate.date() === currentDate.date() &&
+ userCreationDate.month() === currentDate.month()
+ );
+ }
+
+ cakeDayTippy(creator_name: string): string {
+ return i18n.t('cake_day_info', { creator_name });
+ }
+}
diff --git a/ui/src/components/comment-node.tsx b/ui/src/components/comment-node.tsx
index 155efe8e..762344aa 100644
--- a/ui/src/components/comment-node.tsx
+++ b/ui/src/components/comment-node.tsx
@@ -33,6 +33,7 @@ import { CommentForm } from './comment-form';
import { CommentNodes } from './comment-nodes';
import { UserListing } from './user-listing';
import { i18n } from '../i18next';
+import { CakeDay } from './cake-day';
interface CommentNodeState {
showReply: boolean;
@@ -124,6 +125,7 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
render() {
let node = this.props.node;
+ const { creator_name, creator_published } = node.comment;
return (
<div
className={`comment ${
@@ -160,6 +162,12 @@ export class CommentNode extends Component<CommentNodeProps, CommentNodeState> {
}}
/>
</span>
+
+ <CakeDay
+ creator_name={creator_name}
+ creator_published={creator_published}
+ />
+
{this.isMod && (
<div className="badge badge-light d-none d-sm-inline mr-2">
{i18n.t('mod')}
diff --git a/ui/src/components/post-listing.tsx b/ui/src/components/post-listing.tsx
index 3d608842..e6b9721c 100644
--- a/ui/src/components/post-listing.tsx
+++ b/ui/src/components/post-listing.tsx
@@ -35,6 +35,7 @@ import {
previewLines,
} from '../utils';
import { i18n } from '../i18next';
+import { CakeDay } from './cake-day';
interface PostListingState {
showEdit: boolean;
@@ -253,6 +254,8 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
listing() {
let post = this.props.post;
+ const { creator_name, creator_published } = post;
+
return (
<div class="row">
<div className={`vote-bar col-1 pr-0 small text-center`}>
@@ -432,6 +435,12 @@ export class PostListing extends Component<PostListingProps, PostListingState> {
actor_id: post.creator_actor_id,
}}
/>
+
+ <CakeDay
+ creator_name={creator_name}
+ creator_published={creator_published}
+ />
+
{this.isMod && (
<span className="mx-1 badge badge-light">
{i18n.t('mod')}
diff --git a/ui/src/components/symbols.tsx b/ui/src/components/symbols.tsx
index 77d7a086..3386dbe5 100644
--- a/ui/src/components/symbols.tsx
+++ b/ui/src/components/symbols.tsx
@@ -168,6 +168,9 @@ export class Symbols extends Component<any, any> {
<symbol id="icon-spinner" viewBox="0 0 32 32">
<path d="M16 32c-4.274 0-8.292-1.664-11.314-4.686s-4.686-7.040-4.686-11.314c0-3.026 0.849-5.973 2.456-8.522 1.563-2.478 3.771-4.48 6.386-5.791l1.344 2.682c-2.126 1.065-3.922 2.693-5.192 4.708-1.305 2.069-1.994 4.462-1.994 6.922 0 7.168 5.832 13 13 13s13-5.832 13-13c0-2.459-0.69-4.853-1.994-6.922-1.271-2.015-3.066-3.643-5.192-4.708l1.344-2.682c2.615 1.31 4.824 3.313 6.386 5.791 1.607 2.549 2.456 5.495 2.456 8.522 0 4.274-1.664 8.292-4.686 11.314s-7.040 4.686-11.314 4.686z"></path>
</symbol>
+ <symbol id="icon-cake" viewBox="0 0 24 24">
+ <path d="M 23.296875 22.394531 L 22.082031 22.394531 L 22.082031 17.007812 C 22.453125 16.699219 22.664062 16.261719 22.664062 15.796875 L 22.664062 13.984375 C 22.664062 12.996094 21.785156 12.191406 20.703125 12.191406 L 19.785156 12.191406 L 19.785156 7.785156 C 19.785156 7.050781 19.1875 6.449219 18.449219 6.449219 L 18.367188 6.449219 L 18.367188 5.96875 C 19.199219 5.675781 19.796875 4.882812 19.796875 3.957031 C 19.796875 3.644531 19.703125 3.117188 18.996094 1.800781 C 18.632812 1.121094 18.273438 0.550781 18.257812 0.527344 C 18.128906 0.320312 17.90625 0.199219 17.664062 0.199219 C 17.421875 0.199219 17.199219 0.320312 17.070312 0.527344 C 17.054688 0.550781 16.695312 1.121094 16.332031 1.800781 C 15.621094 3.117188 15.53125 3.644531 15.53125 3.957031 C 15.53125 4.882812 16.128906 5.675781 16.960938 5.96875 L 16.960938 6.449219 L 16.878906 6.449219 C 16.140625 6.449219 15.542969 7.050781 15.542969 7.785156 L 15.542969 12.191406 L 14.121094 12.191406 L 14.121094 7.785156 C 14.121094 7.050781 13.523438 6.449219 12.785156 6.449219 L 12.703125 6.449219 L 12.703125 5.96875 C 13.535156 5.675781 14.132812 4.882812 14.132812 3.957031 C 14.132812 3.644531 14.039062 3.117188 13.332031 1.800781 C 12.96875 1.121094 12.609375 0.550781 12.59375 0.527344 C 12.464844 0.320312 12.242188 0.199219 12 0.199219 C 11.757812 0.199219 11.535156 0.320312 11.40625 0.527344 C 11.390625 0.550781 11.03125 1.121094 10.667969 1.800781 C 9.960938 3.117188 9.867188 3.644531 9.867188 3.957031 C 9.867188 4.882812 10.464844 5.675781 11.296875 5.96875 L 11.296875 6.449219 L 11.214844 6.449219 C 10.476562 6.449219 9.878906 7.050781 9.878906 7.785156 L 9.878906 12.191406 L 8.457031 12.191406 L 8.457031 7.785156 C 8.457031 7.050781 7.859375 6.449219 7.121094 6.449219 L 7.039062 6.449219 L 7.039062 5.96875 C 7.871094 5.675781 8.46875 4.882812 8.46875 3.957031 C 8.46875 3.644531 8.378906 3.117188 7.667969 1.800781 C 7.304688 1.121094 6.945312 0.550781 6.929688 0.527344 C 6.800781 0.320312 6.578125 0.199219 6.335938 0.199219 C 6.09375 0.199219 5.871094 0.320312 5.742188 0.527344 C 5.726562 0.550781 5.367188 1.121094 5.003906 1.800781 C 4.296875 3.117188 4.203125 3.644531 4.203125 3.957031 C 4.203125 4.882812 4.800781 5.675781 5.632812 5.96875 L 5.632812 6.449219 L 5.550781 6.449219 C 4.8125 6.449219 4.214844 7.050781 4.214844 7.785156 L 4.214844 12.191406 L 3.296875 12.191406 C 2.214844 12.191406 1.335938 12.996094 1.335938 13.984375 L 1.335938 15.796875 C 1.335938 16.261719 1.546875 16.699219 1.917969 17.007812 L 1.917969 22.394531 L 0.703125 22.394531 C 0.316406 22.394531 0 22.710938 0 23.097656 C 0 23.488281 0.316406 23.800781 0.703125 23.800781 L 23.296875 23.800781 C 23.683594 23.800781 24 23.488281 24 23.097656 C 24 22.710938 23.683594 22.394531 23.296875 22.394531 Z M 16.9375 3.957031 C 16.941406 3.730469 17.246094 3.054688 17.664062 2.289062 C 18.082031 3.054688 18.382812 3.730469 18.390625 3.957031 C 18.390625 4.355469 18.0625 4.679688 17.664062 4.679688 C 17.265625 4.679688 16.9375 4.355469 16.9375 3.957031 Z M 16.949219 7.855469 L 18.378906 7.855469 L 18.378906 12.1875 L 16.949219 12.1875 Z M 11.273438 3.957031 C 11.277344 3.730469 11.582031 3.054688 12 2.289062 C 12.417969 3.054688 12.722656 3.730469 12.726562 3.957031 C 12.726562 4.355469 12.398438 4.679688 12 4.679688 C 11.601562 4.679688 11.273438 4.355469 11.273438 3.957031 Z M 11.285156 7.855469 L 12.714844 7.855469 L 12.714844 12.1875 L 11.285156 12.1875 Z M 5.609375 3.957031 C 5.613281 3.730469 5.917969 3.054688 6.335938 2.289062 C 6.753906 3.054688 7.058594 3.730469 7.0625 3.957031 C 7.0625 4.355469 6.734375 4.679688 6.335938 4.679688 C 5.9375 4.679688 5.609375 4.355469 5.609375 3.957031 Z M 5.621094 7.855469 L 7.050781 7.855469 L 7.050781 12.1875 L 5.621094 12.1875 Z M 20.675781 22.394531 L 3.324219 22.394531 L 3.324219 17.414062 C 3.433594 17.398438 3.546875 17.378906 3.652344 17.347656 L 5.429688 16.820312 C 6.453125 16.515625 7.582031 16.515625 8.609375 16.820312 L 10.011719 17.234375 C 10.652344 17.425781 11.324219 17.519531 12 17.519531 C 12.675781 17.519531 13.347656 17.425781 13.988281 17.234375 L 15.390625 16.820312 C 16.417969 16.515625 17.546875 16.515625 18.570312 16.820312 L 20.347656 17.347656 C 20.453125 17.378906 20.5625 17.398438 20.675781 17.414062 Z M 21.257812 15.796875 C 21.257812 15.855469 21.210938 15.902344 21.171875 15.933594 C 21.082031 16 20.925781 16.050781 20.746094 15.996094 L 18.972656 15.472656 C 17.6875 15.09375 16.273438 15.09375 14.992188 15.472656 L 13.589844 15.886719 C 12.566406 16.191406 11.433594 16.191406 10.410156 15.886719 L 9.007812 15.472656 C 8.367188 15.28125 7.691406 15.1875 7.019531 15.1875 C 6.34375 15.1875 5.671875 15.28125 5.027344 15.472656 L 3.253906 15.996094 C 3.074219 16.050781 2.917969 16 2.828125 15.933594 C 2.789062 15.902344 2.742188 15.855469 2.742188 15.796875 L 2.742188 13.984375 C 2.742188 13.800781 2.96875 13.597656 3.296875 13.597656 L 20.703125 13.597656 C 21.03125 13.597656 21.257812 13.800781 21.257812 13.984375 Z M 21.257812 15.796875 " />
+ </symbol>
</defs>
</svg>
);
diff --git a/ui/src/components/user.tsx b/ui/src/components/user.tsx
index 69914fd3..4f680324 100644
--- a/ui/src/components/user.tsx
+++ b/ui/src/components/user.tsx
@@ -46,6 +46,7 @@ import { ListingTypeSelect } from './listing-type-select';
import { CommentNodes } from './comment-nodes';
import { MomentTime } from './moment-time';
import { i18n } from '../i18next';
+import moment from 'moment';
enum View {
Overview,
@@ -412,6 +413,15 @@ export class User extends Component<any, UserState> {
)}
</ul>
</h5>
+ <div className="d-flex align-items-center mb-2">
+ <svg class="icon">
+ <use xlinkHref="#icon-cake"></use>
+ </svg>
+ <span className="ml-2">
+ {i18n.t('cake_day_title')}{' '}
+ {moment.utc(user.published).local().format('MMM DD, YYYY')}
+ </span>
+ </div>
<div>
{i18n.t('joined')} <MomentTime data={user} showAgo />
</div>
diff --git a/ui/src/interfaces.ts b/ui/src/interfaces.ts
index 7e29319f..774836a2 100644
--- a/ui/src/interfaces.ts
+++ b/ui/src/interfaces.ts
@@ -183,6 +183,7 @@ export interface Post {
creator_actor_id: string;
creator_local: boolean;
creator_name: string;
+ creator_published: string;
creator_avatar?: string;
community_actor_id: string;
community_local: boolean;
@@ -227,6 +228,7 @@ export interface Comment {
creator_local: boolean;
creator_name: string;
creator_avatar?: string;
+ creator_published: string;
score: number;
upvotes: number;
downvotes: number;
diff --git a/ui/translations/en.json b/ui/translations/en.json
index 62b11ce4..3dda5948 100644
--- a/ui/translations/en.json
+++ b/ui/translations/en.json
@@ -265,5 +265,7 @@
"action": "Action",
"emoji_picker": "Emoji Picker",
"block_leaving": "Are you sure you want to leave?",
- "what_is": "What is"
+ "what_is": "What is",
+ "cake_day_title": "Cake day:",
+ "cake_day_info": "It's {{ creator_name }}'s cake day today!"
}