Merge remote-tracking branch 'origin/develop' into themes3

This commit is contained in:
Henry Jameson 2024-02-29 18:49:23 +02:00
commit 54e3a99bc7
29 changed files with 793 additions and 252 deletions

View File

@ -0,0 +1 @@
Support group actors

View File

@ -0,0 +1 @@
Allow hiding custom emojis in picker.

View File

@ -0,0 +1 @@
Display public favorites on user profiles

View File

@ -0,0 +1 @@
Show a dedicated registration notice page when further action is required after registering

View File

@ -261,6 +261,7 @@ const getNodeInfo = async ({ store }) => {
store.dispatch('setInstanceOption', { name: 'pollLimits', value: metadata.pollLimits }) store.dispatch('setInstanceOption', { name: 'pollLimits', value: metadata.pollLimits })
store.dispatch('setInstanceOption', { name: 'mailerEnabled', value: metadata.mailerEnabled }) store.dispatch('setInstanceOption', { name: 'mailerEnabled', value: metadata.mailerEnabled })
store.dispatch('setInstanceOption', { name: 'quotingAvailable', value: features.includes('quote_posting') }) store.dispatch('setInstanceOption', { name: 'quotingAvailable', value: features.includes('quote_posting') })
store.dispatch('setInstanceOption', { name: 'groupActorAvailable', value: features.includes('pleroma:group_actors') })
const uploadLimits = metadata.uploadLimits const uploadLimits = metadata.uploadLimits
store.dispatch('setInstanceOption', { name: 'uploadlimit', value: parseInt(uploadLimits.general) }) store.dispatch('setInstanceOption', { name: 'uploadlimit', value: parseInt(uploadLimits.general) })

View File

@ -114,6 +114,7 @@ const EmojiPicker = {
groupsScrolledClass: 'scrolled-top', groupsScrolledClass: 'scrolled-top',
keepOpen: false, keepOpen: false,
customEmojiTimeout: null, customEmojiTimeout: null,
hideCustomEmojiInPicker: false,
// Lazy-load only after the first time `showing` becomes true. // Lazy-load only after the first time `showing` becomes true.
contentLoaded: false, contentLoaded: false,
groupRefs: {}, groupRefs: {},
@ -286,7 +287,7 @@ const EmojiPicker = {
return 0 return 0
}, },
allCustomGroups () { allCustomGroups () {
if (this.hideCustomEmoji) { if (this.hideCustomEmoji || this.hideCustomEmojiInPicker) {
return {} return {}
} }
const emojis = this.$store.getters.groupedCustomEmojis const emojis = this.$store.getters.groupedCustomEmojis

View File

@ -30,11 +30,16 @@ $emoji-picker-emoji-size: 32px;
} }
.keep-open, .keep-open,
.too-many-emoji { .too-many-emoji,
.hide-custom-emoji {
padding: 7px; padding: 7px;
line-height: normal; line-height: normal;
} }
.hide-custom-emoji {
padding-top: 0;
}
.too-many-emoji { .too-many-emoji {
display: flex; display: flex;
flex-direction: column; flex-direction: column;

View File

@ -142,6 +142,17 @@
{{ $t('emoji.keep_open') }} {{ $t('emoji.keep_open') }}
</Checkbox> </Checkbox>
</div> </div>
<div
v-if="!hideCustomEmoji"
class="hide-custom-emoji"
>
<Checkbox
v-model="hideCustomEmojiInPicker"
@change="onShowing"
>
{{ $t('emoji.hide_custom_emoji') }}
</Checkbox>
</div>
</div> </div>
<div <div
v-if="showingStickers" v-if="showingStickers"

View File

@ -83,6 +83,8 @@ const registration = {
signedIn: (state) => !!state.users.currentUser, signedIn: (state) => !!state.users.currentUser,
isPending: (state) => state.users.signUpPending, isPending: (state) => state.users.signUpPending,
serverValidationErrors: (state) => state.users.signUpErrors, serverValidationErrors: (state) => state.users.signUpErrors,
signUpNotice: (state) => state.users.signUpNotice,
hasSignUpNotice: (state) => !!state.users.signUpNotice.message,
termsOfService: (state) => state.instance.tos, termsOfService: (state) => state.instance.tos,
accountActivationRequired: (state) => state.instance.accountActivationRequired, accountActivationRequired: (state) => state.instance.accountActivationRequired,
accountApprovalRequired: (state) => state.instance.accountApprovalRequired, accountApprovalRequired: (state) => state.instance.accountApprovalRequired,
@ -107,8 +109,12 @@ const registration = {
if (!this.v$.$invalid) { if (!this.v$.$invalid) {
try { try {
await this.signUp(this.user) const status = await this.signUp(this.user)
if (status === 'ok') {
this.$router.push({ name: 'friends' }) this.$router.push({ name: 'friends' })
}
// If status is not 'ok' (i.e. it needs further actions to be done
// before you can login), display sign up notice, do not switch anywhere
} catch (error) { } catch (error) {
console.warn('Registration failed: ', error) console.warn('Registration failed: ', error)
this.setCaptcha() this.setCaptcha()

View File

@ -3,7 +3,10 @@
<div class="panel-heading"> <div class="panel-heading">
{{ $t('registration.registration') }} {{ $t('registration.registration') }}
</div> </div>
<div class="panel-body"> <div
v-if="!hasSignUpNotice"
class="panel-body"
>
<form <form
class="registration-form" class="registration-form"
@submit.prevent="submit(user)" @submit.prevent="submit(user)"
@ -307,6 +310,11 @@
</div> </div>
</form> </form>
</div> </div>
<div v-else>
<p class="registration-notice">
{{ signUpNotice.message }}
</p>
</div>
</div> </div>
</template> </template>
@ -404,6 +412,10 @@ $validations-cRed: #f04124;
} }
} }
.registration-notice {
margin: 0.6em;
}
@media all and (max-width: 800px) { @media all and (max-width: 800px) {
.registration-form .container { .registration-form .container {
flex-direction: column-reverse; flex-direction: column-reverse;

View File

@ -51,7 +51,7 @@
</li> </li>
<li> <li>
<BooleanSetting path="hideBotIndication"> <BooleanSetting path="hideBotIndication">
{{ $t('settings.hide_bot_indication') }} {{ $t('settings.hide_actor_type_indication') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<ChoiceSetting <ChoiceSetting

View File

@ -9,6 +9,7 @@ import suggestor from 'src/components/emoji_input/suggestor.js'
import Autosuggest from 'src/components/autosuggest/autosuggest.vue' import Autosuggest from 'src/components/autosuggest/autosuggest.vue'
import Checkbox from 'src/components/checkbox/checkbox.vue' import Checkbox from 'src/components/checkbox/checkbox.vue'
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue' import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
import Select from 'src/components/select/select.vue'
import BooleanSetting from '../helpers/boolean_setting.vue' import BooleanSetting from '../helpers/boolean_setting.vue'
import SharedComputedObject from '../helpers/shared_computed_object.js' import SharedComputedObject from '../helpers/shared_computed_object.js'
import localeService from 'src/services/locale/locale.service.js' import localeService from 'src/services/locale/locale.service.js'
@ -39,6 +40,7 @@ const ProfileTab = {
showRole: this.$store.state.users.currentUser.show_role, showRole: this.$store.state.users.currentUser.show_role,
role: this.$store.state.users.currentUser.role, role: this.$store.state.users.currentUser.role,
bot: this.$store.state.users.currentUser.bot, bot: this.$store.state.users.currentUser.bot,
actorType: this.$store.state.users.currentUser.actor_type,
pickAvatarBtnVisible: true, pickAvatarBtnVisible: true,
bannerUploading: false, bannerUploading: false,
backgroundUploading: false, backgroundUploading: false,
@ -57,7 +59,8 @@ const ProfileTab = {
ProgressButton, ProgressButton,
Checkbox, Checkbox,
BooleanSetting, BooleanSetting,
InterfaceLanguageSwitcher InterfaceLanguageSwitcher,
Select
}, },
computed: { computed: {
user () { user () {
@ -116,6 +119,12 @@ const ProfileTab = {
bannerImgSrc () { bannerImgSrc () {
const src = this.$store.state.users.currentUser.cover_photo const src = this.$store.state.users.currentUser.cover_photo
return (!src) ? this.defaultBanner : src return (!src) ? this.defaultBanner : src
},
groupActorAvailable () {
return this.$store.state.instance.groupActorAvailable
},
availableActorTypes () {
return this.groupActorAvailable ? ['Person', 'Service', 'Group'] : ['Person', 'Service']
} }
}, },
methods: { methods: {
@ -127,7 +136,7 @@ const ProfileTab = {
/* eslint-disable camelcase */ /* eslint-disable camelcase */
display_name: this.newName, display_name: this.newName,
fields_attributes: this.newFields.filter(el => el != null), fields_attributes: this.newFields.filter(el => el != null),
bot: this.bot, actor_type: this.actorType,
show_role: this.showRole, show_role: this.showRole,
birthday: this.newBirthday || '', birthday: this.newBirthday || '',
show_birthday: this.showBirthday show_birthday: this.showBirthday

View File

@ -111,10 +111,24 @@
</button> </button>
</div> </div>
<p> <p>
<Checkbox v-model="bot"> <label>
{{ $t('settings.bot') }} {{ $t('settings.actor_type') }}
</Checkbox> <Select v-model="actorType">
<option
v-for="option in availableActorTypes"
:key="option"
:value="option"
>
{{ $t('settings.actor_type_' + option) }}
</option>
</Select>
</label>
</p> </p>
<div v-if="groupActorAvailable">
<small>
{{ $t('settings.actor_type_description') }}
</small>
</div>
<p> <p>
<interface-language-switcher <interface-language-switcher
:prompt-text="$t('settings.email_language')" :prompt-text="$t('settings.email_language')"

View File

@ -232,17 +232,11 @@ const Status = {
muteWordHits () { muteWordHits () {
return muteWordHits(this.status, this.muteWords) return muteWordHits(this.status, this.muteWords)
}, },
rtBotStatus () {
return this.statusoid.user.bot
},
botStatus () { botStatus () {
return this.status.user.bot return this.status.user.actor_type === 'Service'
}, },
botIndicator () { showActorTypeIndicator () {
return this.botStatus && !this.hideBotIndication return !this.hideBotIndication
},
rtBotIndicator () {
return this.rtBotStatus && !this.hideBotIndication
}, },
mentionsLine () { mentionsLine () {
if (!this.headTailLinks) return [] if (!this.headTailLinks) return []

View File

@ -79,7 +79,7 @@
<UserAvatar <UserAvatar
v-if="retweet" v-if="retweet"
class="left-side repeater-avatar" class="left-side repeater-avatar"
:bot="rtBotIndicator" :show-actor-type-indicator="showActorTypeIndicator"
:better-shadow="betterShadow" :better-shadow="betterShadow"
:user="statusoid.user" :user="statusoid.user"
/> />
@ -133,7 +133,7 @@
> >
<UserAvatar <UserAvatar
class="post-avatar" class="post-avatar"
:bot="botIndicator" :show-actor-type-indicator="showActorTypeIndicator"
:compact="compact" :compact="compact"
:better-shadow="betterShadow" :better-shadow="betterShadow"
:user="status.user" :user="status.user"
@ -559,7 +559,7 @@
<UserAvatar <UserAvatar
class="post-avatar" class="post-avatar"
:compact="compact" :compact="compact"
:bot="botIndicator" :show-actor-type-indicator="showActorTypeIndicator"
/> />
</div> </div>
<div class="right-side"> <div class="right-side">

View File

@ -3,11 +3,13 @@ import StillImage from '../still-image/still-image.vue'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
faRobot faRobot,
faPeopleGroup
} from '@fortawesome/free-solid-svg-icons' } from '@fortawesome/free-solid-svg-icons'
library.add( library.add(
faRobot faRobot,
faPeopleGroup
) )
const UserAvatar = { const UserAvatar = {
@ -15,7 +17,7 @@ const UserAvatar = {
'user', 'user',
'betterShadow', 'betterShadow',
'compact', 'compact',
'bot' 'showActorTypeIndicator'
], ],
data () { data () {
return { return {

View File

@ -18,9 +18,14 @@
:class="{ '-compact': compact }" :class="{ '-compact': compact }"
/> />
<FAIcon <FAIcon
v-if="bot" v-if="showActorTypeIndicator && user?.actor_type === 'Service'"
icon="robot" icon="robot"
class="bot-indicator" class="actor-type-indicator"
/>
<FAIcon
v-if="showActorTypeIndicator && user?.actor_type === 'Group'"
icon="people-group"
class="actor-type-indicator"
/> />
</span> </span>
</template> </template>
@ -75,7 +80,7 @@
height: 100%; height: 100%;
} }
.bot-indicator { .actor-type-indicator {
position: absolute; position: absolute;
bottom: 0; bottom: 0;
right: 0; right: 0;

View File

@ -124,11 +124,17 @@
{{ $t(`general.role.${visibleRole}`) }} {{ $t(`general.role.${visibleRole}`) }}
</span> </span>
<span <span
v-if="user.bot" v-if="user.actor_type === 'Service'"
class="alert neutral user-role" class="alert neutral user-role"
> >
{{ $t('user_card.bot') }} {{ $t('user_card.bot') }}
</span> </span>
<span
v-if="user.actor_type === 'Group'"
class="alert user-role"
>
{{ $t('user_card.group') }}
</span>
</template> </template>
<span v-if="user.locked"> <span v-if="user.locked">
<FAIcon <FAIcon

View File

@ -80,6 +80,9 @@ const UserProfile = {
followersTabVisible () { followersTabVisible () {
return this.isUs || !this.user.hide_followers return this.isUs || !this.user.hide_followers
}, },
favoritesTabVisible () {
return this.isUs || !this.user.hide_favorites
},
formattedBirthday () { formattedBirthday () {
const browserLocale = localeService.internalToBrowserLocale(this.$i18n.locale) 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' }) return this.user.birthday && new Date(Date.parse(this.user.birthday)).toLocaleDateString(browserLocale, { timeZone: 'UTC', day: 'numeric', month: 'long', year: 'numeric' })
@ -103,6 +106,8 @@ const UserProfile = {
startFetchingTimeline('user', userId) startFetchingTimeline('user', userId)
startFetchingTimeline('media', userId) startFetchingTimeline('media', userId)
if (this.isUs) { if (this.isUs) {
startFetchingTimeline('favorites')
} else if (!this.user.hide_favorites) {
startFetchingTimeline('favorites', userId) startFetchingTimeline('favorites', userId)
} }
// Fetch all pinned statuses immediately // Fetch all pinned statuses immediately

View File

@ -109,7 +109,7 @@
:footer-slipgate="footerRef" :footer-slipgate="footerRef"
/> />
<Timeline <Timeline
v-if="isUs" v-if="favoritesTabVisible"
key="favorites" key="favorites"
:label="$t('user_card.favorites')" :label="$t('user_card.favorites')"
:disabled="!favorites.visibleStatuses.length" :disabled="!favorites.visibleStatuses.length"
@ -117,6 +117,7 @@
:title="$t('user_card.favorites')" :title="$t('user_card.favorites')"
timeline-name="favorites" timeline-name="favorites"
:timeline="favorites" :timeline="favorites"
:user-id="userId"
:in-profile="true" :in-profile="true"
:footer-slipgate="footerRef" :footer-slipgate="footerRef"
/> />

View File

@ -237,6 +237,7 @@
"search_emoji": "Search for an emoji", "search_emoji": "Search for an emoji",
"add_emoji": "Insert emoji", "add_emoji": "Insert emoji",
"custom": "Custom emoji", "custom": "Custom emoji",
"hide_custom_emoji": "Hide custom emojis",
"unpacked": "Unpacked emoji", "unpacked": "Unpacked emoji",
"unicode": "Unicode emoji", "unicode": "Unicode emoji",
"unicode_groups": { "unicode_groups": {
@ -359,6 +360,11 @@
"remove_language": "Remove", "remove_language": "Remove",
"primary_language": "Primary language:", "primary_language": "Primary language:",
"fallback_language": "Fallback language {index}:", "fallback_language": "Fallback language {index}:",
"actor_type": "This account is:",
"actor_type_description": "Marking your account as a group will make it automatically repeat statuses that mention it.",
"actor_type_Person": "a normal user",
"actor_type_Service": "a bot",
"actor_type_Group": "a group",
"app_name": "App name", "app_name": "App name",
"expert_mode": "Show advanced", "expert_mode": "Show advanced",
"save": "Save changes", "save": "Save changes",
@ -423,7 +429,6 @@
"added_backup": "Added a new backup.", "added_backup": "Added a new backup.",
"add_backup_error": "Error adding a new backup: {error}", "add_backup_error": "Error adding a new backup: {error}",
"blocks_tab": "Blocks", "blocks_tab": "Blocks",
"bot": "This is a bot account",
"btnRadius": "Buttons", "btnRadius": "Buttons",
"cBlue": "Blue (Reply, follow)", "cBlue": "Blue (Reply, follow)",
"cGreen": "Green (Retweet)", "cGreen": "Green (Retweet)",
@ -495,7 +500,7 @@
"hide_media_previews": "Hide media previews", "hide_media_previews": "Hide media previews",
"hide_muted_posts": "Hide posts of muted users", "hide_muted_posts": "Hide posts of muted users",
"mute_bot_posts": "Mute bot posts", "mute_bot_posts": "Mute bot posts",
"hide_bot_indication": "Hide bot indication in posts", "hide_actor_type_indication": "Hide actor type (bots, groups, etc.) indication in posts",
"hide_scrobbles": "Hide scrobbles", "hide_scrobbles": "Hide scrobbles",
"hide_all_muted_posts": "Hide muted posts", "hide_all_muted_posts": "Hide muted posts",
"max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)", "max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)",
@ -1127,6 +1132,7 @@
"hide_repeats": "Hide repeats", "hide_repeats": "Hide repeats",
"show_repeats": "Show repeats", "show_repeats": "Show repeats",
"bot": "Bot", "bot": "Bot",
"group": "Group",
"birthday": "Born {birthday}", "birthday": "Born {birthday}",
"admin_menu": { "admin_menu": {
"moderation": "Moderation", "moderation": "Moderation",

View File

@ -163,7 +163,8 @@
"search_close": "けんさくバーをとじる", "search_close": "けんさくバーをとじる",
"edit_nav_mobile": "ナビゲーションバーのせっていをかえる", "edit_nav_mobile": "ナビゲーションバーのせっていをかえる",
"mobile_sidebar": "モバイルのサイドバーをきりかえる", "mobile_sidebar": "モバイルのサイドバーをきりかえる",
"edit_finish": "へんしゅうをおわりにする" "edit_finish": "へんしゅうをおわりにする",
"mobile_notifications_mark_as_seen": "ぜんぶ みたことにする"
}, },
"notifications": { "notifications": {
"broken_favorite": "ステータスがみつかりません。さがしています…", "broken_favorite": "ステータスがみつかりません。さがしています…",
@ -179,7 +180,13 @@
"migrated_to": "インスタンスを、ひっこしました", "migrated_to": "インスタンスを、ひっこしました",
"reacted_with": "{0} でリアクションしました", "reacted_with": "{0} でリアクションしました",
"poll_ended": "とうひょうが、おわりました", "poll_ended": "とうひょうが、おわりました",
"submitted_report": "つうほうしました" "submitted_report": "つうほうしました",
"unread_announcements": "まだ よんでいない おしらせが {num}こ あります",
"configuration_tip_settings": "せってい",
"configuration_tip_dismiss": "つぎは ひょうじしない",
"unread_chats": "よんでいない チャットが {num}こ あります",
"unread_follow_requests": "フォローリクエストが {num}こ あります",
"configuration_tip": "ここに ひょうじする ものを {theSettings}で へんこうできます。 {dismiss}"
}, },
"polls": { "polls": {
"add_poll": "とうひょうをはじめる", "add_poll": "とうひょうをはじめる",
@ -218,7 +225,8 @@
"symbols": "きごう", "symbols": "きごう",
"travel-and-places": "りょこう・ばしょ" "travel-and-places": "りょこう・ばしょ"
}, },
"regional_indicator": "ばしょをしめすきごう {letter}" "regional_indicator": "ばしょをしめすきごう {letter}",
"unpacked": "アンパックされた えもじ"
}, },
"stickers": { "stickers": {
"add_sticker": "ステッカーをふやす" "add_sticker": "ステッカーをふやす"
@ -269,7 +277,9 @@
"preview": "プレビュー", "preview": "プレビュー",
"preview_empty": "なにもありません", "preview_empty": "なにもありません",
"empty_status_error": "とうこうないようを、にゅうりょくしてください", "empty_status_error": "とうこうないようを、にゅうりょくしてください",
"scope_notice_dismiss": "このつうちをとじる" "scope_notice_dismiss": "このつうちをとじる",
"reply_option": "この ステータスに へんしんする",
"quote_option": "この ステータスを いんようする"
}, },
"registration": { "registration": {
"bio": "プロフィール", "bio": "プロフィール",
@ -324,7 +334,7 @@
"warning_of_generate_new_codes": "あたらしいリカバリーコードをつくったら、ふるいコードはつかえなくなります。", "warning_of_generate_new_codes": "あたらしいリカバリーコードをつくったら、ふるいコードはつかえなくなります。",
"recovery_codes": "リカバリーコード。", "recovery_codes": "リカバリーコード。",
"waiting_a_recovery_codes": "バックアップコードをうけとっています…", "waiting_a_recovery_codes": "バックアップコードをうけとっています…",
"recovery_codes_warning": "コードをかきうつすか、ひとにみられないところにセーブしてください。そうでなければ、あなたはこのコードをふたたびみることはできません。もしあなたが、2FAアプリのアクセスをうしなって、なおかつ、リカバリーコードもおもいだせないならば、あなたはあなたのアカウントから、しめだされます。", "recovery_codes_warning": "コードを かきうつすか、 ほかのひとが みれないところに ほぞんしてください。 そうしないと、 あなたは このコードを にどと みることができません。 もし あなたが 2FAアプリに アクセスできなくなり、 リカバリーコードも おもいだせないなら、 あなたは あなたの アカウントに はいれなくなります。",
"authentication_methods": "にんしょうメソッド", "authentication_methods": "にんしょうメソッド",
"scan": { "scan": {
"title": "スキャン", "title": "スキャン",
@ -697,7 +707,7 @@
"import_mutes_from_a_csv_file": "CSVファイルからミュートをインポートする", "import_mutes_from_a_csv_file": "CSVファイルからミュートをインポートする",
"reset_avatar": "アバターをリセットする", "reset_avatar": "アバターをリセットする",
"remove_language": "とりのぞく", "remove_language": "とりのぞく",
"primary_language": "いちばんわかることば:", "primary_language": "さいしょに つかう ことば:",
"add_language": "よびとしてつかうことばを、ついかする", "add_language": "よびとしてつかうことばを、ついかする",
"fallback_language": "よびとして つかう ことば {index}:", "fallback_language": "よびとして つかう ことば {index}:",
"lists_navigation": "ナビゲーションにリストをひょうじする", "lists_navigation": "ナビゲーションにリストをひょうじする",
@ -797,7 +807,11 @@
"virtual_scrolling": "タイムラインのレンダリングをよくする", "virtual_scrolling": "タイムラインのレンダリングをよくする",
"use_at_icon": "{'@'} きごうを、もじのかわりに、アイコンでひょうじする", "use_at_icon": "{'@'} きごうを、もじのかわりに、アイコンでひょうじする",
"mention_link_display_short": "いつも、みじかいなまえにする (れい: {'@'}hoge)", "mention_link_display_short": "いつも、みじかいなまえにする (れい: {'@'}hoge)",
"mention_link_display": "メンションのリンクをひょうじするけいしき" "mention_link_display": "メンションのリンクをひょうじするけいしき",
"url": "URL",
"preview": "プレビュー",
"emoji_reactions_scale": "リアクションを なんばいの おおきさで ひょうじするか",
"autocomplete_select_first": "じどうほかんが あれば、 さいしょの ものを じどうで えらぶ"
}, },
"time": { "time": {
"day": "{0}日", "day": "{0}日",

File diff suppressed because it is too large Load Diff

View File

@ -109,7 +109,8 @@
"mobile_notifications_close": "알림 닫기", "mobile_notifications_close": "알림 닫기",
"mobile_sidebar": "모바일 사이드바 토글", "mobile_sidebar": "모바일 사이드바 토글",
"announcements": "공지사항", "announcements": "공지사항",
"search_close": "검색 바 닫기" "search_close": "검색 바 닫기",
"mobile_notifications_mark_as_seen": "모두 읽음으로 표시"
}, },
"notifications": { "notifications": {
"broken_favorite": "알 수 없는 게시물입니다, 검색합니다…", "broken_favorite": "알 수 없는 게시물입니다, 검색합니다…",
@ -125,7 +126,13 @@
"error": "알림 불러오기 실패: {0}", "error": "알림 불러오기 실패: {0}",
"follow_request": "팔로우 요청", "follow_request": "팔로우 요청",
"submitted_report": "신고 내용을 전송함", "submitted_report": "신고 내용을 전송함",
"poll_ended": "투표가 끝남" "poll_ended": "투표가 끝남",
"unread_follow_requests": "{num}개의 새 팔로우 요청 | {num}개의 새 팔로우 요청",
"configuration_tip": "{theSettings}에서 어떻게 보이는지 바꿀 수 있습니다. {dismiss}",
"configuration_tip_settings": "설정",
"configuration_tip_dismiss": "다시 보지 않기",
"unread_announcements": "{num}개의 읽지 않은 공지사항 | {num}개의 읽지 않은 공지사항",
"unread_chats": "{num}개의 읽지 않은 채팅 | {num}개의 읽지 않은 채팅"
}, },
"post_status": { "post_status": {
"new_status": "새 게시물 게시", "new_status": "새 게시물 게시",
@ -165,7 +172,9 @@
"post": "게시", "post": "게시",
"direct_warning_to_first_only": "맨 앞에 멘션한 사용자들에게만 보여집니다.", "direct_warning_to_first_only": "맨 앞에 멘션한 사용자들에게만 보여집니다.",
"content_type_selection": "게시물 형태", "content_type_selection": "게시물 형태",
"scope_notice_dismiss": "알림 닫기" "scope_notice_dismiss": "알림 닫기",
"reply_option": "이 게시물에 답글",
"quote_option": "이 게시물을 인용"
}, },
"registration": { "registration": {
"bio": "소개", "bio": "소개",

View File

@ -943,7 +943,7 @@
"sandbox": "强制帖子为只有关注者可看", "sandbox": "强制帖子为只有关注者可看",
"disable_remote_subscription": "禁止从远程实例关注用户", "disable_remote_subscription": "禁止从远程实例关注用户",
"disable_any_subscription": "完全禁止关注用户", "disable_any_subscription": "完全禁止关注用户",
"quarantine": "从联合实例中禁止用户帖子", "quarantine": "不许帖子传入别站",
"delete_user": "删除用户", "delete_user": "删除用户",
"delete_user_data_and_deactivate_confirmation": "这将永久删除该账户的数据并停用该账户。你完全确定吗?" "delete_user_data_and_deactivate_confirmation": "这将永久删除该账户的数据并停用该账户。你完全确定吗?"
}, },

View File

@ -137,6 +137,7 @@ const defaultState = {
suggestionsEnabled: false, suggestionsEnabled: false,
suggestionsWeb: '', suggestionsWeb: '',
quotingAvailable: false, quotingAvailable: false,
groupActorAvailable: false,
// Html stuff // Html stuff
instanceSpecificPanelContent: '', instanceSpecificPanelContent: '',

View File

@ -250,6 +250,7 @@ export const mutations = {
signUpPending (state) { signUpPending (state) {
state.signUpPending = true state.signUpPending = true
state.signUpErrors = [] state.signUpErrors = []
state.signUpNotice = {}
}, },
signUpSuccess (state) { signUpSuccess (state) {
state.signUpPending = false state.signUpPending = false
@ -257,6 +258,12 @@ export const mutations = {
signUpFailure (state, errors) { signUpFailure (state, errors) {
state.signUpPending = false state.signUpPending = false
state.signUpErrors = errors state.signUpErrors = errors
state.signUpNotice = {}
},
signUpNotice (state, notice) {
state.signUpPending = false
state.signUpErrors = []
state.signUpNotice = notice
} }
} }
@ -287,6 +294,7 @@ export const defaultState = {
usersByNameObject: {}, usersByNameObject: {},
signUpPending: false, signUpPending: false,
signUpErrors: [], signUpErrors: [],
signUpNotice: {},
relationships: {} relationships: {}
} }
@ -524,9 +532,16 @@ const users = {
const data = await rootState.api.backendInteractor.register( const data = await rootState.api.backendInteractor.register(
{ params: { ...userInfo } } { params: { ...userInfo } }
) )
if (data.access_token) {
store.commit('signUpSuccess') store.commit('signUpSuccess')
store.commit('setToken', data.access_token) store.commit('setToken', data.access_token)
store.dispatch('loginUser', data.access_token) store.dispatch('loginUser', data.access_token)
return 'ok'
} else { // Request succeeded, but user cannot login yet.
store.commit('signUpNotice', data)
return 'request_sent'
}
} catch (e) { } catch (e) {
const errors = e.message const errors = e.message
store.commit('signUpFailure', errors) store.commit('signUpFailure', errors)

View File

@ -108,6 +108,7 @@ const PLEROMA_POST_ANNOUNCEMENT_URL = '/api/v1/pleroma/admin/announcements'
const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}` const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
const PLEROMA_SCROBBLES_URL = id => `/api/v1/pleroma/accounts/${id}/scrobbles` const PLEROMA_SCROBBLES_URL = id => `/api/v1/pleroma/accounts/${id}/scrobbles`
const PLEROMA_USER_FAVORITES_TIMELINE_URL = id => `/api/v1/pleroma/accounts/${id}/favourites`
const PLEROMA_ADMIN_CONFIG_URL = '/api/pleroma/admin/config' const PLEROMA_ADMIN_CONFIG_URL = '/api/pleroma/admin/config'
const PLEROMA_ADMIN_DESCRIPTIONS_URL = '/api/pleroma/admin/config/descriptions' const PLEROMA_ADMIN_DESCRIPTIONS_URL = '/api/pleroma/admin/config/descriptions'
@ -690,6 +691,7 @@ const fetchTimeline = ({
media: MASTODON_USER_TIMELINE_URL, media: MASTODON_USER_TIMELINE_URL,
list: MASTODON_LIST_TIMELINE_URL, list: MASTODON_LIST_TIMELINE_URL,
favorites: MASTODON_USER_FAVORITES_TIMELINE_URL, favorites: MASTODON_USER_FAVORITES_TIMELINE_URL,
publicFavorites: PLEROMA_USER_FAVORITES_TIMELINE_URL,
tag: MASTODON_TAG_TIMELINE_URL, tag: MASTODON_TAG_TIMELINE_URL,
bookmarks: MASTODON_BOOKMARK_TIMELINE_URL bookmarks: MASTODON_BOOKMARK_TIMELINE_URL
} }
@ -698,6 +700,10 @@ const fetchTimeline = ({
let url = timelineUrls[timeline] let url = timelineUrls[timeline]
if (timeline === 'favorites' && userId) {
url = timelineUrls.publicFavorites(userId)
}
if (timeline === 'user' || timeline === 'media') { if (timeline === 'user' || timeline === 'media') {
url = url(userId) url = url(userId)
} }

View File

@ -107,6 +107,7 @@ export const parseUser = (data) => {
output.allow_following_move = data.pleroma.allow_following_move output.allow_following_move = data.pleroma.allow_following_move
output.hide_favorites = data.pleroma.hide_favorites
output.hide_follows = data.pleroma.hide_follows output.hide_follows = data.pleroma.hide_follows
output.hide_followers = data.pleroma.hide_followers output.hide_followers = data.pleroma.hide_followers
output.hide_follows_count = data.pleroma.hide_follows_count output.hide_follows_count = data.pleroma.hide_follows_count
@ -165,6 +166,7 @@ export const parseUser = (data) => {
output.show_role = data.source.pleroma.show_role output.show_role = data.source.pleroma.show_role
output.discoverable = data.source.pleroma.discoverable output.discoverable = data.source.pleroma.discoverable
output.show_birthday = data.pleroma.show_birthday output.show_birthday = data.pleroma.show_birthday
output.actor_type = data.source.pleroma.actor_type
} }
} }