Browse Source

Birthdays

Signed-off-by: marcin mikołajczak <git@mkljczk.pl>
marcin mikołajczak 2 years ago
parent
commit
79d02bddbe

+ 5 - 1
src/components/settings_modal/tabs/profile_tab.js

@@ -29,6 +29,8 @@ const ProfileTab = {
       newLocked: this.$store.state.users.currentUser.locked,
       newNoRichText: this.$store.state.users.currentUser.no_rich_text,
       newDefaultScope: this.$store.state.users.currentUser.default_scope,
+      newBirthday: this.$store.state.users.currentUser.birthday,
+      showBirthday: this.$store.state.users.currentUser.show_birthday,
       newFields: this.$store.state.users.currentUser.fields.map(field => ({ name: field.name, value: field.value })),
       hideFollows: this.$store.state.users.currentUser.hide_follows,
       hideFollowers: this.$store.state.users.currentUser.hide_followers,
@@ -132,7 +134,9 @@ const ProfileTab = {
             allow_following_move: this.allowFollowingMove,
             hide_follows_count: this.hideFollowsCount,
             hide_followers_count: this.hideFollowersCount,
-            show_role: this.showRole
+            show_role: this.showRole,
+            birthday: this.newBirthday || null,
+            show_birthday: this.showBirthday
             /* eslint-enable camelcase */
           } }).then((user) => {
           this.newFields.splice(user.fields.length)

+ 5 - 0
src/components/settings_modal/tabs/profile_tab.scss

@@ -124,4 +124,9 @@
       padding: 0 0.5em;
     }
   }
+
+  .birthday-input {
+    display: block;
+    margin-bottom: 1em;
+  }
 }

+ 12 - 0
src/components/settings_modal/tabs/profile_tab.vue

@@ -95,6 +95,18 @@
           {{ $t('settings.discoverable') }}
         </Checkbox>
       </p>
+      <div>
+        <p>{{ $t('settings.birthday.label') }}</p>
+        <input
+          id="birthday"
+          v-model="newBirthday"
+          type="date"
+          class="birthday-input"
+        >
+        <Checkbox v-model="showBirthday">
+          {{ $t('settings.birthday.show_birthday') }}
+        </Checkbox>
+      </div>
       <div v-if="maxFields > 0">
         <p>{{ $t('settings.profile_fields.label') }}</p>
         <div

+ 9 - 2
src/components/user_profile/user_profile.js

@@ -7,13 +7,16 @@ import TabSwitcher from 'src/components/tab_switcher/tab_switcher.js'
 import RichContent from 'src/components/rich_content/rich_content.jsx'
 import List from '../list/list.vue'
 import withLoadMore from '../../hocs/with_load_more/with_load_more'
+import localeService from 'src/services/locale/locale.service.js'
 import { library } from '@fortawesome/fontawesome-svg-core'
 import {
-  faCircleNotch
+  faCircleNotch,
+  faBirthdayCake
 } from '@fortawesome/free-solid-svg-icons'
 
 library.add(
-  faCircleNotch
+  faCircleNotch,
+  faBirthdayCake
 )
 
 const FollowerList = withLoadMore({
@@ -75,6 +78,10 @@ const UserProfile = {
     },
     followersTabVisible () {
       return this.isUs || !this.user.hide_followers
+    },
+    formattedBirthday () {
+      const browserLocale = localeService.internalToBrowserLocale(this.$i18n.locale)
+      return this.user.birthday && new Date(Date.parse(this.user.birthday)).toLocaleDateString(browserLocale, { timeZone: 'UTC', day: 'numeric', month: 'long', year: 'numeric' })
     }
   },
   methods: {

+ 14 - 0
src/components/user_profile/user_profile.vue

@@ -11,6 +11,16 @@
         :allow-zooming-avatar="true"
         rounded="top"
       />
+      <span
+        v-if="!!user.birthday"
+        class="user-birthday"
+      >
+        <FAIcon
+          class="fa-old-padding"
+          icon="birthday-cake"
+        />
+        {{ $t('user_card.birthday', { birthday: formattedBirthday }) }}
+      </span>
       <div
         v-if="user.fields_html && user.fields_html.length > 0"
         class="user-profile-fields"
@@ -138,6 +148,10 @@
   flex: 2;
   flex-basis: 500px;
 
+  .user-birthday {
+    margin: 0 0.75em 0.5em;
+  }
+
   .user-profile-fields {
     margin: 0 0.5em;
 

+ 5 - 0
src/i18n/en.json

@@ -399,6 +399,10 @@
       "name": "Label",
       "value": "Content"
     },
+    "birthday": {
+      "label": "Birthday",
+      "show_birthday": "Show my birthday"
+    },
     "use_contain_fit": "Don't crop the attachment in thumbnails",
     "name": "Name",
     "name_bio": "Name & bio",
@@ -774,6 +778,7 @@
     "hide_repeats": "Hide repeats",
     "show_repeats": "Show repeats",
     "bot": "Bot",
+    "birthday": "Born {birthday}",
     "admin_menu": {
       "moderation": "Moderation",
       "grant_admin": "Grant Admin",

+ 7 - 2
src/i18n/pl.json

@@ -633,7 +633,11 @@
     "reply_visibility_following_short": "Pokazuj odpowiedzi obserwującym",
     "reply_visibility_self_short": "Pokazuj odpowiedzi tylko do mnie",
     "sensitive_by_default": "Domyślnie oznaczaj wpisy jako wrażliwe",
-    "hide_shoutbox": "Ukryj shoutbox instancji"
+    "hide_shoutbox": "Ukryj shoutbox instancji",
+    "birthday": {
+      "label": "Urodziny",
+      "show_birthday": "Pokazuj moją datę urodzenia"
+    }
   },
   "time": {
     "day": "{0} dzień",
@@ -770,7 +774,8 @@
     "highlight": {
       "disabled": "Bez wyróżnienia"
     },
-    "bot": "Bot"
+    "bot": "Bot",
+    "birthday": "Urodzony(-a) {birthday}"
   },
   "user_profile": {
     "timeline_title": "Oś czasu użytkownika",

+ 3 - 0
src/services/entity_normalizer/entity_normalizer.service.js

@@ -118,6 +118,8 @@ export const parseUser = (data) => {
       } else {
         output.role = 'member'
       }
+
+      output.birthday = data.pleroma.birthday
     }
 
     if (data.source) {
@@ -128,6 +130,7 @@ export const parseUser = (data) => {
         output.no_rich_text = data.source.pleroma.no_rich_text
         output.show_role = data.source.pleroma.show_role
         output.discoverable = data.source.pleroma.discoverable
+        output.show_birthday = data.pleroma.show_birthday
       }
     }