this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

New featured profiles UI

+431 -139
+1
src/components/ICONS.jsx
··· 179 179 month: () => import('@iconify-icons/mingcute/calendar-month-line'), 180 180 day: () => import('@iconify-icons/mingcute/calendar-day-line'), 181 181 camera: () => import('@iconify-icons/mingcute/camera-line'), 182 + endorsement: () => import('@iconify-icons/mingcute/user-star-line'), 182 183 };
+112
src/components/account-info.css
··· 956 956 } 957 957 } 958 958 } 959 + 960 + .endorsements-container { 961 + padding: 16px; 962 + overflow-x: auto; 963 + overflow-y: hidden; 964 + /* background-image: linear-gradient( 965 + to bottom, 966 + var(--bg-faded-color), 967 + var(--bg-color) calc(16px + 1em) 968 + ); */ 969 + background-image: radial-gradient( 970 + ellipse at top center, 971 + var(--bg-faded-color), 972 + var(--bg-color) 973 + ); 974 + background-size: 100% 32px; 975 + background-repeat: no-repeat; 976 + mask-image: linear-gradient( 977 + var(--to-forward), 978 + transparent, 979 + black 16px calc(100% - 16px), 980 + transparent 981 + ); 982 + 983 + h3 { 984 + margin: 0; 985 + padding: 0 0 8px; 986 + font-weight: normal; 987 + color: var(--text-insignificant-color); 988 + font-size: 85%; 989 + position: sticky; 990 + left: 0; 991 + text-transform: uppercase; 992 + font-weight: 600; 993 + 994 + > * { 995 + vertical-align: text-bottom; 996 + } 997 + } 998 + 999 + .endorsements { 1000 + margin: 0; 1001 + padding: 0; 1002 + list-style: none; 1003 + /* display: flex; 1004 + flex-direction: row; 1005 + gap: 8px; */ 1006 + 1007 + /* grid: 2 rows, infinite columns, no wrap */ 1008 + display: grid; 1009 + grid-auto-flow: column; 1010 + grid-template-rows: repeat(2, auto); 1011 + white-space: nowrap; 1012 + gap: 8px; 1013 + 1014 + &.expanded { 1015 + grid-template-rows: repeat(3, auto); 1016 + } 1017 + 1018 + > li { 1019 + min-width: 20em; 1020 + max-width: 90%; 1021 + display: flex; 1022 + } 1023 + 1024 + .account-block { 1025 + overflow: hidden; 1026 + flex-grow: 1; 1027 + padding: 8px 16px; 1028 + background-color: var(--bg-faded-color); 1029 + background-image: linear-gradient( 1030 + 15deg, 1031 + var(--link-bg-color), 1032 + var(--bg-faded-color) 8px calc(100% - 16px), 1033 + var(--bg-color) 1034 + ); 1035 + &:dir(rtl) { 1036 + background-image: linear-gradient( 1037 + -15deg, 1038 + var(--link-bg-color), 1039 + var(--bg-faded-color) 16px calc(100% - 16px), 1040 + var(--bg-color) 1041 + ); 1042 + } 1043 + /* box-shadow: inset 0 0 0 2px var(--bg-color); */ 1044 + border-radius: 8px; 1045 + transition: all 0.15s ease-out; 1046 + 1047 + .avatar { 1048 + transition: transform 0.15s ease-out; 1049 + } 1050 + 1051 + &:is(:hover, :focus-visible) { 1052 + background-color: var(--link-bg-hover-color); 1053 + box-shadow: inset 0 0 0 2px var(--link-light-color); 1054 + 1055 + .avatar { 1056 + transform: rotate(15deg); 1057 + } 1058 + } 1059 + 1060 + &:active { 1061 + transition-duration: 0s; 1062 + filter: brightness(0.8); 1063 + } 1064 + 1065 + .tag { 1066 + background-color: var(--bg-color); 1067 + } 1068 + } 1069 + } 1070 + }
+154 -2
src/components/account-info.jsx
··· 21 21 import { getLists } from '../utils/lists'; 22 22 import niceDateTime from '../utils/nice-date-time'; 23 23 import pmem from '../utils/pmem'; 24 + import { fetchRelationships } from '../utils/relationships'; 24 25 import shortenNumber from '../utils/shorten-number'; 25 26 import showCompose from '../utils/show-compose'; 26 27 import showToast from '../utils/show-toast'; ··· 127 128 maxAge: ACCOUNT_INFO_MAX_AGE, 128 129 }); 129 130 131 + const ENDORSEMENTS_LIMIT = 80; 132 + 130 133 function AccountInfo({ 131 134 account, 132 135 fetchAccount = () => {}, 133 136 standalone, 134 137 instance, 135 138 authenticated, 139 + showEndorsements = false, 136 140 }) { 137 141 const { i18n, t } = useLingui(); 138 142 const { masto, authenticated: currentAuthenticated } = api({ ··· 367 371 368 372 const [showEditProfile, setShowEditProfile] = useState(false); 369 373 374 + const endorsementsContainer = useRef(); 375 + const [renderEndorsements, setRenderEndorsements] = useState(false); 376 + const [endorsements, setEndorsements] = useState([]); 377 + const [relationshipsMap, setRelationshipsMap] = useState({}); 378 + useEffect(() => { 379 + if (!supports('@mastodon/endorsements')) return; 380 + if (!showEndorsements) return; 381 + if (!renderEndorsements) return; 382 + (async () => { 383 + try { 384 + const accounts = await masto.v1.accounts.$select(id).endorsements.list({ 385 + limit: ENDORSEMENTS_LIMIT, 386 + }); 387 + console.log({ endorsements: accounts }); 388 + if (!accounts.length) return; 389 + setEndorsements(accounts); 390 + setTimeout(() => { 391 + endorsementsContainer.current.scrollIntoView({ 392 + behavior: 'smooth', 393 + block: 'nearest', 394 + }); 395 + }, 300); 396 + 397 + const relationships = await fetchRelationships( 398 + accounts, 399 + relationshipsMap, 400 + ); 401 + if (relationships) { 402 + setRelationshipsMap(relationships); 403 + } 404 + } catch (e) { 405 + console.error(e); 406 + } 407 + })(); 408 + }, [showEndorsements, renderEndorsements, id]); 409 + 370 410 return ( 371 411 <> 372 412 <div ··· 986 1026 onRelationshipChange={onRelationshipChange} 987 1027 onProfileUpdate={onProfileUpdate} 988 1028 setShowEditProfile={setShowEditProfile} 1029 + renderEndorsements={renderEndorsements} 1030 + setRenderEndorsements={setRenderEndorsements} 989 1031 /> 990 1032 </footer> 1033 + {renderEndorsements && endorsements.length > 0 && ( 1034 + <div class="shazam-container"> 1035 + <div class="shazam-container-inner"> 1036 + <div 1037 + class="endorsements-container" 1038 + ref={endorsementsContainer} 1039 + > 1040 + <h3> 1041 + <Trans>Profiles featured by @{info.username}</Trans> 1042 + </h3> 1043 + <ul 1044 + class={`endorsements ${ 1045 + endorsements.length > 10 ? 'expanded' : '' 1046 + }`} 1047 + > 1048 + {endorsements.map((account) => ( 1049 + <li> 1050 + <AccountBlock 1051 + key={account.id} 1052 + account={account} 1053 + showStats 1054 + avatarSize="xxl" 1055 + relationship={relationshipsMap[account.id]} 1056 + /> 1057 + </li> 1058 + ))} 1059 + </ul> 1060 + </div> 1061 + </div> 1062 + </div> 1063 + )} 991 1064 </> 992 1065 ) 993 1066 )} ··· 1022 1095 onRelationshipChange = () => {}, 1023 1096 onProfileUpdate = () => {}, 1024 1097 setShowEditProfile = () => {}, 1098 + renderEndorsements = false, 1099 + setRenderEndorsements = () => {}, 1025 1100 }) { 1026 1101 if (!info) return null; 1027 1102 const { _, t } = useLingui(); ··· 1058 1133 const [isSelf, setIsSelf] = useState(false); 1059 1134 1060 1135 const acctWithInstance = acct.includes('@') ? acct : `${acct}@${instance}`; 1136 + 1137 + const supportsEndorsements = supports('@mastodon/endorsements'); 1061 1138 1062 1139 useEffect(() => { 1063 1140 if (info) { ··· 1219 1296 } 1220 1297 }} 1221 1298 > 1222 - {currentAuthenticated && !isSelf && ( 1299 + {currentAuthenticated && !isSelf ? ( 1223 1300 <> 1224 1301 <MenuItem 1225 1302 onClick={() => { ··· 1323 1400 </MenuItem> 1324 1401 </> 1325 1402 )} 1403 + {supportsEndorsements && following && ( 1404 + <MenuItem 1405 + onClick={() => { 1406 + setRelationshipUIState('loading'); 1407 + (async () => { 1408 + try { 1409 + if (endorsed) { 1410 + const newRelationship = 1411 + await currentMasto.v1.accounts 1412 + .$select(currentInfo?.id || id) 1413 + .unpin(); 1414 + setRelationship(newRelationship); 1415 + setRelationshipUIState('default'); 1416 + showToast( 1417 + t`@${username} is no longer featured on your profile.`, 1418 + ); 1419 + } else { 1420 + const newRelationship = 1421 + await currentMasto.v1.accounts 1422 + .$select(currentInfo?.id || id) 1423 + .pin(); 1424 + setRelationship(newRelationship); 1425 + setRelationshipUIState('default'); 1426 + showToast( 1427 + t`@${username} is now featured on your profile.`, 1428 + ); 1429 + } 1430 + } catch (e) { 1431 + console.error(e); 1432 + setRelationshipUIState('error'); 1433 + if (endorsed) { 1434 + showToast( 1435 + t`Unable to unfeature @${username} on your profile.`, 1436 + ); 1437 + } else { 1438 + showToast( 1439 + t`Unable to feature @${username} on your profile.`, 1440 + ); 1441 + } 1442 + } 1443 + })(); 1444 + }} 1445 + > 1446 + <Icon icon="endorsement" /> 1447 + {endorsed 1448 + ? "Don't feature on profile" 1449 + : 'Feature on profile'} 1450 + </MenuItem> 1451 + )} 1452 + {supportsEndorsements && !renderEndorsements && ( 1453 + <MenuItem onClick={() => setRenderEndorsements(true)}> 1454 + <Icon icon="endorsement" /> 1455 + <span> 1456 + <Trans>Show featured profiles</Trans> 1457 + </span> 1458 + </MenuItem> 1459 + )} 1326 1460 {/* Add/remove from lists is only possible if following the account */} 1327 1461 {following && ( 1328 1462 <MenuItem ··· 1351 1485 )} 1352 1486 <MenuDivider /> 1353 1487 </> 1488 + ) : ( 1489 + supportsEndorsements && 1490 + !renderEndorsements && ( 1491 + <> 1492 + <MenuItem onClick={() => setRenderEndorsements(true)}> 1493 + <Icon icon="endorsement" /> 1494 + Show featured profiles 1495 + </MenuItem> 1496 + <MenuDivider /> 1497 + </> 1498 + ) 1354 1499 )} 1355 1500 <MenuItem 1356 1501 onClick={() => { ··· 1734 1879 .follow(); 1735 1880 } 1736 1881 1737 - if (newRelationship) setRelationship(newRelationship); 1882 + if (newRelationship) { 1883 + setRelationship(newRelationship); 1884 + 1885 + // Show endorsements if start following 1886 + if (newRelationship.following) { 1887 + setRenderEndorsements(true); 1888 + } 1889 + } 1738 1890 setRelationshipUIState('default'); 1739 1891 } catch (e) { 1740 1892 alert(e);
+2 -1
src/data/features.json
··· 6 6 "@mastodon/fetch-multiple-statuses": "~4.3 || >=4.3", 7 7 "@mastodon/trending-link-posts": "~4.3 || >=4.3", 8 8 "@mastodon/grouped-notifications": "~4.3 || >=4.3", 9 - "@mastodon/annual-report": "~4.4 || >=4.4" 9 + "@mastodon/annual-report": "~4.4 || >=4.4", 10 + "@mastodon/endorsements": "~4.4 || >=4.4" 10 11 }
+161 -136
src/locales/en.po
··· 28 28 msgstr "" 29 29 30 30 #: src/components/account-block.jsx:163 31 - #: src/components/account-info.jsx:692 31 + #: src/components/account-info.jsx:732 32 32 msgid "Automated" 33 33 msgstr "" 34 34 35 35 #: src/components/account-block.jsx:170 36 - #: src/components/account-info.jsx:697 36 + #: src/components/account-info.jsx:737 37 37 #: src/components/status.jsx:588 38 38 msgid "Group" 39 39 msgstr "" ··· 43 43 msgstr "" 44 44 45 45 #: src/components/account-block.jsx:184 46 - #: src/components/account-info.jsx:1764 46 + #: src/components/account-info.jsx:1916 47 47 msgid "Requested" 48 48 msgstr "" 49 49 50 50 #: src/components/account-block.jsx:188 51 - #: src/components/account-info.jsx:1755 51 + #: src/components/account-info.jsx:1907 52 52 msgid "Following" 53 53 msgstr "" 54 54 55 55 #: src/components/account-block.jsx:192 56 - #: src/components/account-info.jsx:1146 56 + #: src/components/account-info.jsx:1223 57 57 msgid "Follows you" 58 58 msgstr "" 59 59 ··· 62 62 msgstr "" 63 63 64 64 #: src/components/account-block.jsx:209 65 - #: src/components/account-info.jsx:740 65 + #: src/components/account-info.jsx:780 66 66 msgid "Verified" 67 67 msgstr "" 68 68 69 69 #. placeholder {0}: niceDateTime(createdAt, { hideTime: true, }) 70 70 #. placeholder {0}: niceDateTime(createdAt, { hideTime: true, }) 71 71 #: src/components/account-block.jsx:224 72 - #: src/components/account-info.jsx:842 72 + #: src/components/account-info.jsx:882 73 73 msgid "Joined <0>{0}</0>" 74 74 msgstr "" 75 75 76 - #: src/components/account-info.jsx:57 76 + #: src/components/account-info.jsx:58 77 77 msgid "Forever" 78 78 msgstr "" 79 79 80 - #: src/components/account-info.jsx:385 80 + #: src/components/account-info.jsx:425 81 81 msgid "Unable to load account." 82 82 msgstr "" 83 83 84 - #: src/components/account-info.jsx:400 84 + #: src/components/account-info.jsx:440 85 85 msgid "Go to account page" 86 86 msgstr "" 87 87 88 - #: src/components/account-info.jsx:429 89 - #: src/components/account-info.jsx:762 90 - #: src/components/account-info.jsx:792 88 + #: src/components/account-info.jsx:469 89 + #: src/components/account-info.jsx:802 90 + #: src/components/account-info.jsx:832 91 91 msgid "Followers" 92 92 msgstr "" 93 93 94 94 #. js-lingui-explicit-id 95 - #: src/components/account-info.jsx:433 96 - #: src/components/account-info.jsx:802 97 - #: src/components/account-info.jsx:821 95 + #: src/components/account-info.jsx:473 96 + #: src/components/account-info.jsx:842 97 + #: src/components/account-info.jsx:861 98 98 msgid "following.stats" 99 99 msgstr "Following" 100 100 101 - #: src/components/account-info.jsx:436 102 - #: src/components/account-info.jsx:838 103 - #: src/pages/account-statuses.jsx:479 101 + #: src/components/account-info.jsx:476 102 + #: src/components/account-info.jsx:878 103 + #: src/pages/account-statuses.jsx:480 104 104 #: src/pages/search.jsx:341 105 105 #: src/pages/search.jsx:488 106 106 msgid "Posts" 107 107 msgstr "" 108 108 109 - #: src/components/account-info.jsx:444 110 - #: src/components/account-info.jsx:1202 109 + #: src/components/account-info.jsx:484 110 + #: src/components/account-info.jsx:1279 111 111 #: src/components/compose.jsx:2776 112 112 #: src/components/media-alt-modal.jsx:46 113 113 #: src/components/media-modal.jsx:359 ··· 116 116 #: src/components/status.jsx:1968 117 117 #: src/components/status.jsx:2588 118 118 #: src/components/status.jsx:2591 119 - #: src/pages/account-statuses.jsx:523 119 + #: src/pages/account-statuses.jsx:524 120 120 #: src/pages/accounts.jsx:110 121 121 #: src/pages/hashtag.jsx:200 122 122 #: src/pages/list.jsx:158 ··· 127 127 msgid "More" 128 128 msgstr "" 129 129 130 - #: src/components/account-info.jsx:456 130 + #: src/components/account-info.jsx:496 131 131 msgid "<0>{displayName}</0> has indicated that their new account is now:" 132 132 msgstr "" 133 133 134 - #: src/components/account-info.jsx:601 135 - #: src/components/account-info.jsx:1360 134 + #: src/components/account-info.jsx:641 135 + #: src/components/account-info.jsx:1505 136 136 msgid "Handle copied" 137 137 msgstr "Handle copied" 138 138 139 - #: src/components/account-info.jsx:604 140 - #: src/components/account-info.jsx:1363 139 + #: src/components/account-info.jsx:644 140 + #: src/components/account-info.jsx:1508 141 141 msgid "Unable to copy handle" 142 142 msgstr "Unable to copy handle" 143 143 144 - #: src/components/account-info.jsx:610 145 - #: src/components/account-info.jsx:1369 144 + #: src/components/account-info.jsx:650 145 + #: src/components/account-info.jsx:1514 146 146 msgid "Copy handle" 147 147 msgstr "" 148 148 149 - #: src/components/account-info.jsx:616 149 + #: src/components/account-info.jsx:656 150 150 msgid "Go to original profile page" 151 151 msgstr "" 152 152 153 - #: src/components/account-info.jsx:634 153 + #: src/components/account-info.jsx:674 154 154 msgid "View profile image" 155 155 msgstr "" 156 156 157 - #: src/components/account-info.jsx:652 157 + #: src/components/account-info.jsx:692 158 158 msgid "View profile header" 159 159 msgstr "" 160 160 161 - #: src/components/account-info.jsx:668 162 - #: src/components/account-info.jsx:1670 163 - #: src/components/account-info.jsx:2189 161 + #: src/components/account-info.jsx:708 162 + #: src/components/account-info.jsx:1815 163 + #: src/components/account-info.jsx:2341 164 164 msgid "Edit profile" 165 165 msgstr "" 166 166 167 - #: src/components/account-info.jsx:687 167 + #: src/components/account-info.jsx:727 168 168 msgid "In Memoriam" 169 169 msgstr "" 170 170 171 - #: src/components/account-info.jsx:769 172 - #: src/components/account-info.jsx:812 171 + #: src/components/account-info.jsx:809 172 + #: src/components/account-info.jsx:852 173 173 msgid "This user has chosen to not make this information available." 174 174 msgstr "This user has chosen to not make this information available." 175 175 176 176 #. placeholder {0}: ( postingStats.originals / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', }) 177 177 #. placeholder {1}: ( postingStats.replies / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', }) 178 178 #. placeholder {2}: ( postingStats.boosts / postingStats.total ).toLocaleString(i18n.locale || undefined, { style: 'percent', }) 179 - #: src/components/account-info.jsx:867 179 + #: src/components/account-info.jsx:907 180 180 msgid "{0} original posts, {1} replies, {2} boosts" 181 181 msgstr "{0} original posts, {1} replies, {2} boosts" 182 182 ··· 187 187 #. placeholder {4}: postingStats.total 188 188 #. placeholder {5}: postingStats.total 189 189 #. placeholder {6}: postingStats.daysSinceLastPost 190 - #: src/components/account-info.jsx:883 190 + #: src/components/account-info.jsx:923 191 191 msgid "{0, plural, one {{1, plural, one {Last 1 post in the past 1 day} other {Last 1 post in the past {2} days}}} other {{3, plural, one {Last {4} posts in the past 1 day} other {Last {5} posts in the past {6} days}}}}" 192 192 msgstr "" 193 193 194 194 #. placeholder {0}: postingStats.total 195 195 #. placeholder {1}: postingStats.total 196 - #: src/components/account-info.jsx:899 196 + #: src/components/account-info.jsx:939 197 197 msgid "{0, plural, one {Last 1 post in the past year(s)} other {Last {1} posts in the past year(s)}}" 198 198 msgstr "" 199 199 200 - #: src/components/account-info.jsx:924 200 + #: src/components/account-info.jsx:964 201 201 #: src/pages/catchup.jsx:71 202 202 msgid "Original" 203 203 msgstr "" 204 204 205 - #: src/components/account-info.jsx:928 205 + #: src/components/account-info.jsx:968 206 206 #: src/components/status.jsx:2372 207 207 #: src/pages/catchup.jsx:72 208 208 #: src/pages/catchup.jsx:1448 ··· 212 212 msgid "Replies" 213 213 msgstr "" 214 214 215 - #: src/components/account-info.jsx:932 215 + #: src/components/account-info.jsx:972 216 216 #: src/pages/catchup.jsx:73 217 217 #: src/pages/catchup.jsx:1450 218 218 #: src/pages/catchup.jsx:2075 ··· 220 220 msgid "Boosts" 221 221 msgstr "" 222 222 223 - #: src/components/account-info.jsx:938 223 + #: src/components/account-info.jsx:978 224 224 msgid "Post stats unavailable." 225 225 msgstr "" 226 226 227 - #: src/components/account-info.jsx:969 227 + #: src/components/account-info.jsx:1009 228 228 msgid "View post stats" 229 229 msgstr "" 230 230 231 + #. placeholder {0}: info.username 232 + #: src/components/account-info.jsx:1041 233 + msgid "Profiles featured by @{0}" 234 + msgstr "Profiles featured by @{0}" 235 + 231 236 #. placeholder {0}: niceDateTime(lastStatusAt, { hideTime: true, }) 232 - #: src/components/account-info.jsx:1150 237 + #: src/components/account-info.jsx:1227 233 238 msgid "Last post: <0>{0}</0>" 234 239 msgstr "" 235 240 236 - #: src/components/account-info.jsx:1164 241 + #: src/components/account-info.jsx:1241 237 242 msgid "Muted" 238 243 msgstr "" 239 244 240 - #: src/components/account-info.jsx:1169 245 + #: src/components/account-info.jsx:1246 241 246 msgid "Blocked" 242 247 msgstr "" 243 248 244 - #: src/components/account-info.jsx:1178 249 + #: src/components/account-info.jsx:1255 245 250 msgid "Private note" 246 251 msgstr "Private note" 247 252 248 - #: src/components/account-info.jsx:1235 253 + #: src/components/account-info.jsx:1312 249 254 msgid "Mention <0>@{username}</0>" 250 255 msgstr "" 251 256 252 - #: src/components/account-info.jsx:1247 257 + #: src/components/account-info.jsx:1324 253 258 msgid "Translate bio" 254 259 msgstr "" 255 260 256 - #: src/components/account-info.jsx:1258 261 + #: src/components/account-info.jsx:1335 257 262 msgid "Edit private note" 258 263 msgstr "Edit private note" 259 264 260 - #: src/components/account-info.jsx:1258 265 + #: src/components/account-info.jsx:1335 261 266 msgid "Add private note" 262 267 msgstr "Add private note" 263 268 264 - #: src/components/account-info.jsx:1278 269 + #: src/components/account-info.jsx:1355 265 270 msgid "Notifications enabled for @{username}'s posts." 266 271 msgstr "Notifications enabled for @{username}'s posts." 267 272 268 - #: src/components/account-info.jsx:1279 273 + #: src/components/account-info.jsx:1356 269 274 msgid " Notifications disabled for @{username}'s posts." 270 275 msgstr " Notifications disabled for @{username}'s posts." 271 276 272 - #: src/components/account-info.jsx:1291 277 + #: src/components/account-info.jsx:1368 273 278 msgid "Disable notifications" 274 279 msgstr "Disable notifications" 275 280 276 - #: src/components/account-info.jsx:1292 281 + #: src/components/account-info.jsx:1369 277 282 msgid "Enable notifications" 278 283 msgstr "Enable notifications" 279 284 280 - #: src/components/account-info.jsx:1309 285 + #: src/components/account-info.jsx:1386 281 286 msgid "Boosts from @{username} enabled." 282 287 msgstr "Boosts from @{username} enabled." 283 288 284 - #: src/components/account-info.jsx:1310 289 + #: src/components/account-info.jsx:1387 285 290 msgid "Boosts from @{username} disabled." 286 291 msgstr "Boosts from @{username} disabled." 287 292 288 - #: src/components/account-info.jsx:1321 293 + #: src/components/account-info.jsx:1398 289 294 msgid "Disable boosts" 290 295 msgstr "Disable boosts" 291 296 292 - #: src/components/account-info.jsx:1321 297 + #: src/components/account-info.jsx:1398 293 298 msgid "Enable boosts" 294 299 msgstr "Enable boosts" 295 300 296 - #: src/components/account-info.jsx:1337 297 - #: src/components/account-info.jsx:1347 298 - #: src/components/account-info.jsx:1935 301 + #: src/components/account-info.jsx:1417 302 + msgid "@{username} is no longer featured on your profile." 303 + msgstr "@{username} is no longer featured on your profile." 304 + 305 + #: src/components/account-info.jsx:1427 306 + msgid "@{username} is now featured on your profile." 307 + msgstr "@{username} is now featured on your profile." 308 + 309 + #: src/components/account-info.jsx:1435 310 + msgid "Unable to unfeature @{username} on your profile." 311 + msgstr "Unable to unfeature @{username} on your profile." 312 + 313 + #: src/components/account-info.jsx:1439 314 + msgid "Unable to feature @{username} on your profile." 315 + msgstr "Unable to feature @{username} on your profile." 316 + 317 + #: src/components/account-info.jsx:1456 318 + msgid "Show featured profiles" 319 + msgstr "Show featured profiles" 320 + 321 + #: src/components/account-info.jsx:1471 322 + #: src/components/account-info.jsx:1481 323 + #: src/components/account-info.jsx:2087 299 324 msgid "Add/Remove from Lists" 300 325 msgstr "" 301 326 302 - #: src/components/account-info.jsx:1386 327 + #: src/components/account-info.jsx:1531 303 328 #: src/components/status.jsx:1253 304 329 msgid "Link copied" 305 330 msgstr "" 306 331 307 - #: src/components/account-info.jsx:1389 332 + #: src/components/account-info.jsx:1534 308 333 #: src/components/status.jsx:1256 309 334 msgid "Unable to copy link" 310 335 msgstr "" 311 336 312 - #: src/components/account-info.jsx:1395 337 + #: src/components/account-info.jsx:1540 313 338 #: src/components/shortcuts-settings.jsx:1059 314 339 #: src/components/status.jsx:1262 315 340 #: src/components/status.jsx:3366 316 341 msgid "Copy" 317 342 msgstr "" 318 343 319 - #: src/components/account-info.jsx:1410 344 + #: src/components/account-info.jsx:1555 320 345 #: src/components/shortcuts-settings.jsx:1077 321 346 #: src/components/status.jsx:1278 322 347 msgid "Sharing doesn't seem to work." 323 348 msgstr "" 324 349 325 - #: src/components/account-info.jsx:1416 350 + #: src/components/account-info.jsx:1561 326 351 #: src/components/status.jsx:1284 327 352 msgid "Share…" 328 353 msgstr "" 329 354 330 - #: src/components/account-info.jsx:1436 355 + #: src/components/account-info.jsx:1581 331 356 msgid "Unmuted @{username}" 332 357 msgstr "Unmuted @{username}" 333 358 334 - #: src/components/account-info.jsx:1448 359 + #: src/components/account-info.jsx:1593 335 360 msgid "Unmute <0>@{username}</0>" 336 361 msgstr "" 337 362 338 - #: src/components/account-info.jsx:1464 363 + #: src/components/account-info.jsx:1609 339 364 msgid "Mute <0>@{username}</0>…" 340 365 msgstr "" 341 366 342 367 #. placeholder {0}: typeof MUTE_DURATIONS_LABELS[duration] === 'function' ? MUTE_DURATIONS_LABELS[duration]() : _(MUTE_DURATIONS_LABELS[duration]) 343 - #: src/components/account-info.jsx:1496 368 + #: src/components/account-info.jsx:1641 344 369 msgid "Muted @{username} for {0}" 345 370 msgstr "Muted @{username} for {0}" 346 371 347 - #: src/components/account-info.jsx:1508 372 + #: src/components/account-info.jsx:1653 348 373 msgid "Unable to mute @{username}" 349 374 msgstr "Unable to mute @{username}" 350 375 351 - #: src/components/account-info.jsx:1529 376 + #: src/components/account-info.jsx:1674 352 377 msgid "Remove <0>@{username}</0> from followers?" 353 378 msgstr "" 354 379 355 - #: src/components/account-info.jsx:1549 380 + #: src/components/account-info.jsx:1694 356 381 msgid "@{username} removed from followers" 357 382 msgstr "@{username} removed from followers" 358 383 359 - #: src/components/account-info.jsx:1561 384 + #: src/components/account-info.jsx:1706 360 385 msgid "Remove follower…" 361 386 msgstr "" 362 387 363 - #: src/components/account-info.jsx:1572 388 + #: src/components/account-info.jsx:1717 364 389 msgid "Block <0>@{username}</0>?" 365 390 msgstr "" 366 391 367 - #: src/components/account-info.jsx:1596 392 + #: src/components/account-info.jsx:1741 368 393 msgid "Unblocked @{username}" 369 394 msgstr "Unblocked @{username}" 370 395 371 - #: src/components/account-info.jsx:1604 396 + #: src/components/account-info.jsx:1749 372 397 msgid "Blocked @{username}" 373 398 msgstr "Blocked @{username}" 374 399 375 - #: src/components/account-info.jsx:1612 400 + #: src/components/account-info.jsx:1757 376 401 msgid "Unable to unblock @{username}" 377 402 msgstr "Unable to unblock @{username}" 378 403 379 - #: src/components/account-info.jsx:1614 404 + #: src/components/account-info.jsx:1759 380 405 msgid "Unable to block @{username}" 381 406 msgstr "Unable to block @{username}" 382 407 383 - #: src/components/account-info.jsx:1624 408 + #: src/components/account-info.jsx:1769 384 409 msgid "Unblock <0>@{username}</0>" 385 410 msgstr "" 386 411 387 - #: src/components/account-info.jsx:1633 412 + #: src/components/account-info.jsx:1778 388 413 msgid "Block <0>@{username}</0>…" 389 414 msgstr "" 390 415 391 - #: src/components/account-info.jsx:1650 416 + #: src/components/account-info.jsx:1795 392 417 msgid "Report <0>@{username}</0>…" 393 418 msgstr "" 394 419 395 - #: src/components/account-info.jsx:1706 420 + #: src/components/account-info.jsx:1851 396 421 msgid "Withdraw follow request?" 397 422 msgstr "Withdraw follow request?" 398 423 399 424 #. placeholder {0}: info.acct || info.username 400 - #: src/components/account-info.jsx:1707 425 + #: src/components/account-info.jsx:1852 401 426 msgid "Unfollow @{0}?" 402 427 msgstr "Unfollow @{0}?" 403 428 404 - #: src/components/account-info.jsx:1758 429 + #: src/components/account-info.jsx:1910 405 430 msgid "Unfollow…" 406 431 msgstr "" 407 432 408 - #: src/components/account-info.jsx:1767 433 + #: src/components/account-info.jsx:1919 409 434 msgid "Withdraw…" 410 435 msgstr "" 411 436 412 - #: src/components/account-info.jsx:1774 413 - #: src/components/account-info.jsx:1778 437 + #: src/components/account-info.jsx:1926 438 + #: src/components/account-info.jsx:1930 414 439 #: src/pages/hashtag.jsx:262 415 440 msgid "Follow" 416 441 msgstr "" 417 442 418 - #: src/components/account-info.jsx:1875 419 - #: src/components/account-info.jsx:1930 420 - #: src/components/account-info.jsx:2064 421 - #: src/components/account-info.jsx:2184 443 + #: src/components/account-info.jsx:2027 444 + #: src/components/account-info.jsx:2082 445 + #: src/components/account-info.jsx:2216 446 + #: src/components/account-info.jsx:2336 422 447 #: src/components/account-sheet.jsx:38 423 448 #: src/components/compose.jsx:884 424 449 #: src/components/compose.jsx:2732 ··· 451 476 msgid "Close" 452 477 msgstr "" 453 478 454 - #: src/components/account-info.jsx:1880 479 + #: src/components/account-info.jsx:2032 455 480 msgid "Translated Bio" 456 481 msgstr "" 457 482 458 - #: src/components/account-info.jsx:1975 483 + #: src/components/account-info.jsx:2127 459 484 msgid "Unable to remove from list." 460 485 msgstr "Unable to remove from list." 461 486 462 - #: src/components/account-info.jsx:1976 487 + #: src/components/account-info.jsx:2128 463 488 msgid "Unable to add to list." 464 489 msgstr "Unable to add to list." 465 490 466 - #: src/components/account-info.jsx:1995 491 + #: src/components/account-info.jsx:2147 467 492 #: src/pages/lists.jsx:105 468 493 msgid "Unable to load lists." 469 494 msgstr "" 470 495 471 - #: src/components/account-info.jsx:1999 496 + #: src/components/account-info.jsx:2151 472 497 msgid "No lists." 473 498 msgstr "" 474 499 475 - #: src/components/account-info.jsx:2010 500 + #: src/components/account-info.jsx:2162 476 501 #: src/components/list-add-edit.jsx:40 477 502 #: src/pages/lists.jsx:59 478 503 msgid "New list" 479 504 msgstr "" 480 505 481 506 #. placeholder {0}: account?.username || account?.acct 482 - #: src/components/account-info.jsx:2069 507 + #: src/components/account-info.jsx:2221 483 508 msgid "Private note about <0>@{0}</0>" 484 509 msgstr "" 485 510 486 - #: src/components/account-info.jsx:2099 511 + #: src/components/account-info.jsx:2251 487 512 msgid "Unable to update private note." 488 513 msgstr "Unable to update private note." 489 514 490 - #: src/components/account-info.jsx:2122 491 - #: src/components/account-info.jsx:2420 515 + #: src/components/account-info.jsx:2274 516 + #: src/components/account-info.jsx:2572 492 517 msgid "Cancel" 493 518 msgstr "" 494 519 495 - #: src/components/account-info.jsx:2127 520 + #: src/components/account-info.jsx:2279 496 521 msgid "Save & close" 497 522 msgstr "" 498 523 499 - #: src/components/account-info.jsx:2244 524 + #: src/components/account-info.jsx:2396 500 525 msgid "Unable to update profile." 501 526 msgstr "Unable to update profile." 502 527 503 - #: src/components/account-info.jsx:2251 528 + #: src/components/account-info.jsx:2403 504 529 msgid "Header picture" 505 530 msgstr "Header picture" 506 531 507 - #: src/components/account-info.jsx:2303 532 + #: src/components/account-info.jsx:2455 508 533 msgid "Profile picture" 509 534 msgstr "Profile picture" 510 535 511 - #: src/components/account-info.jsx:2355 536 + #: src/components/account-info.jsx:2507 512 537 #: src/components/list-add-edit.jsx:105 513 538 msgid "Name" 514 539 msgstr "" 515 540 516 - #: src/components/account-info.jsx:2368 541 + #: src/components/account-info.jsx:2520 517 542 msgid "Bio" 518 543 msgstr "" 519 544 520 - #: src/components/account-info.jsx:2381 545 + #: src/components/account-info.jsx:2533 521 546 msgid "Extra fields" 522 547 msgstr "" 523 548 524 - #: src/components/account-info.jsx:2387 549 + #: src/components/account-info.jsx:2539 525 550 msgid "Label" 526 551 msgstr "" 527 552 528 - #: src/components/account-info.jsx:2390 553 + #: src/components/account-info.jsx:2542 529 554 msgid "Content" 530 555 msgstr "" 531 556 532 - #: src/components/account-info.jsx:2423 557 + #: src/components/account-info.jsx:2575 533 558 #: src/components/list-add-edit.jsx:150 534 559 #: src/components/shortcuts-settings.jsx:715 535 560 #: src/pages/filters.jsx:570 ··· 537 562 msgid "Save" 538 563 msgstr "" 539 564 540 - #: src/components/account-info.jsx:2477 565 + #: src/components/account-info.jsx:2629 541 566 msgid "username" 542 567 msgstr "" 543 568 544 - #: src/components/account-info.jsx:2481 569 + #: src/components/account-info.jsx:2633 545 570 msgid "server domain name" 546 571 msgstr "" 547 572 ··· 1010 1035 msgstr "" 1011 1036 1012 1037 #: src/components/drafts.jsx:250 1013 - #: src/pages/account-statuses.jsx:360 1038 + #: src/pages/account-statuses.jsx:361 1014 1039 msgid "Media" 1015 1040 msgstr "" 1016 1041 ··· 1418 1443 msgstr "" 1419 1444 1420 1445 #: src/components/nav-menu.jsx:268 1421 - #: src/pages/account-statuses.jsx:326 1446 + #: src/pages/account-statuses.jsx:327 1422 1447 #: src/pages/filters.jsx:55 1423 1448 #: src/pages/filters.jsx:94 1424 1449 #: src/pages/hashtag.jsx:340 ··· 2578 2603 msgid "{accountDisplay} ({monthYear})" 2579 2604 msgstr "" 2580 2605 2581 - #: src/pages/account-statuses.jsx:316 2606 + #: src/pages/account-statuses.jsx:317 2582 2607 msgid "Clear filters" 2583 2608 msgstr "" 2584 2609 2585 - #: src/pages/account-statuses.jsx:319 2610 + #: src/pages/account-statuses.jsx:320 2586 2611 msgid "Clear" 2587 2612 msgstr "" 2588 2613 2589 - #: src/pages/account-statuses.jsx:333 2614 + #: src/pages/account-statuses.jsx:334 2590 2615 msgid "Showing post with replies" 2591 2616 msgstr "" 2592 2617 2593 - #: src/pages/account-statuses.jsx:338 2618 + #: src/pages/account-statuses.jsx:339 2594 2619 msgid "+ Replies" 2595 2620 msgstr "" 2596 2621 2597 - #: src/pages/account-statuses.jsx:344 2622 + #: src/pages/account-statuses.jsx:345 2598 2623 msgid "Showing posts without boosts" 2599 2624 msgstr "" 2600 2625 2601 - #: src/pages/account-statuses.jsx:349 2626 + #: src/pages/account-statuses.jsx:350 2602 2627 msgid "- Boosts" 2603 2628 msgstr "" 2604 2629 2605 - #: src/pages/account-statuses.jsx:355 2630 + #: src/pages/account-statuses.jsx:356 2606 2631 msgid "Showing posts with media" 2607 2632 msgstr "" 2608 2633 2609 2634 #. placeholder {0}: tag.name 2610 - #: src/pages/account-statuses.jsx:372 2635 + #: src/pages/account-statuses.jsx:373 2611 2636 msgid "Showing posts tagged with #{0}" 2612 2637 msgstr "" 2613 2638 2614 2639 #. placeholder {0}: date.toLocaleString(i18n.locale, { month: 'long', year: 'numeric', }) 2615 - #: src/pages/account-statuses.jsx:411 2640 + #: src/pages/account-statuses.jsx:412 2616 2641 msgid "Showing posts in {0}" 2617 2642 msgstr "Showing posts in {0}" 2618 2643 2619 - #: src/pages/account-statuses.jsx:500 2644 + #: src/pages/account-statuses.jsx:501 2620 2645 msgid "Nothing to see here yet." 2621 2646 msgstr "" 2622 2647 2623 - #: src/pages/account-statuses.jsx:501 2648 + #: src/pages/account-statuses.jsx:502 2624 2649 #: src/pages/public.jsx:98 2625 2650 #: src/pages/trending.jsx:447 2626 2651 msgid "Unable to load posts" 2627 2652 msgstr "" 2628 2653 2629 - #: src/pages/account-statuses.jsx:542 2630 - #: src/pages/account-statuses.jsx:572 2654 + #: src/pages/account-statuses.jsx:543 2655 + #: src/pages/account-statuses.jsx:573 2631 2656 msgid "Unable to fetch account info" 2632 2657 msgstr "" 2633 2658 2634 2659 #. placeholder {0}: accountInstance ? ( <> {' '} (<b>{punycode.toUnicode(accountInstance)}</b>) </> ) : null 2635 - #: src/pages/account-statuses.jsx:549 2660 + #: src/pages/account-statuses.jsx:550 2636 2661 msgid "Switch to account's instance {0}" 2637 2662 msgstr "" 2638 2663 2639 - #: src/pages/account-statuses.jsx:579 2664 + #: src/pages/account-statuses.jsx:580 2640 2665 msgid "Switch to my instance (<0>{currentInstance}</0>)" 2641 2666 msgstr "" 2642 2667 2643 - #: src/pages/account-statuses.jsx:641 2668 + #: src/pages/account-statuses.jsx:642 2644 2669 msgid "Month" 2645 2670 msgstr "" 2646 2671
+1
src/pages/account-statuses.jsx
··· 300 300 fetchAccount={fetchAccount} 301 301 authenticated={authenticated} 302 302 standalone 303 + showEndorsements 303 304 /> 304 305 {!mediaFirst && ( 305 306 <div