diff --git a/.gitignore b/.gitignore
index d314bca08..8cdcc8d27 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,7 @@
/db/*.sqlite3-journal
# Ignore all logfiles and tempfiles.
+.eslintcache
/log/*
!/log/.keep
/tmp
diff --git a/AUTHORS.md b/AUTHORS.md
index 5f5985fba..a03aaf7ca 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -3,6 +3,7 @@ Authors
Mastodon is available on [GitHub](https://github.com/tootsuite/mastodon)
and provided thanks to the work of the following contributors:
+* [Tykayn](https://framagit.org/tykayn) for the Bliss version
* [Gargron](https://github.com/Gargron)
* [ThibG](https://github.com/ThibG)
diff --git a/Gemfile b/Gemfile
index 43696f461..3a0161c45 100644
--- a/Gemfile
+++ b/Gemfile
@@ -6,7 +6,8 @@ ruby '>= 2.4.0', '< 2.7.0'
gem 'pkg-config', '~> 1.4'
gem 'puma', '~> 4.3'
-gem 'rails', '~> 5.2.3'
+gem 'rails', '~> 5.2.4'
+gem 'sprockets', '~> 3.7'
gem 'thor', '~> 0.20'
gem 'hamlit-rails', '~> 0.2'
@@ -122,7 +123,7 @@ group :test do
gem 'rspec-sidekiq', '~> 3.0'
gem 'simplecov', '~> 0.17', require: false
gem 'webmock', '~> 3.7'
- gem 'parallel_tests', '~> 2.29'
+ gem 'parallel_tests', '~> 2.30'
end
group :development do
diff --git a/Gemfile.lock b/Gemfile.lock
index b68bcccfb..1aea709e9 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -44,25 +44,25 @@ GIT
GEM
remote: https://rubygems.org/
specs:
- actioncable (5.2.3)
- actionpack (= 5.2.3)
+ actioncable (5.2.4)
+ actionpack (= 5.2.4)
nio4r (~> 2.0)
websocket-driver (>= 0.6.1)
- actionmailer (5.2.3)
- actionpack (= 5.2.3)
- actionview (= 5.2.3)
- activejob (= 5.2.3)
+ actionmailer (5.2.4)
+ actionpack (= 5.2.4)
+ actionview (= 5.2.4)
+ activejob (= 5.2.4)
mail (~> 2.5, >= 2.5.4)
rails-dom-testing (~> 2.0)
- actionpack (5.2.3)
- actionview (= 5.2.3)
- activesupport (= 5.2.3)
+ actionpack (5.2.4)
+ actionview (= 5.2.4)
+ activesupport (= 5.2.4)
rack (~> 2.0)
rack-test (>= 0.6.3)
rails-dom-testing (~> 2.0)
rails-html-sanitizer (~> 1.0, >= 1.0.2)
- actionview (5.2.3)
- activesupport (= 5.2.3)
+ actionview (5.2.4)
+ activesupport (= 5.2.4)
builder (~> 3.1)
erubi (~> 1.4)
rails-dom-testing (~> 2.0)
@@ -73,20 +73,20 @@ GEM
case_transform (>= 0.2)
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
active_record_query_trace (1.7)
- activejob (5.2.3)
- activesupport (= 5.2.3)
+ activejob (5.2.4)
+ activesupport (= 5.2.4)
globalid (>= 0.3.6)
- activemodel (5.2.3)
- activesupport (= 5.2.3)
- activerecord (5.2.3)
- activemodel (= 5.2.3)
- activesupport (= 5.2.3)
+ activemodel (5.2.4)
+ activesupport (= 5.2.4)
+ activerecord (5.2.4)
+ activemodel (= 5.2.4)
+ activesupport (= 5.2.4)
arel (>= 9.0)
- activestorage (5.2.3)
- actionpack (= 5.2.3)
- activerecord (= 5.2.3)
+ activestorage (5.2.4)
+ actionpack (= 5.2.4)
+ activerecord (= 5.2.4)
marcel (~> 0.3.1)
- activesupport (5.2.3)
+ activesupport (5.2.4)
concurrent-ruby (~> 1.0, >= 1.0.2)
i18n (>= 0.7, < 2)
minitest (~> 5.1)
@@ -218,7 +218,7 @@ GEM
docile (1.3.2)
domain_name (0.5.20180417)
unf (>= 0.0.5, < 1.0.0)
- doorkeeper (5.2.2)
+ doorkeeper (5.2.3)
railties (>= 5)
dotenv (2.7.5)
dotenv-rails (2.7.5)
@@ -238,9 +238,9 @@ GEM
erubi (1.9.0)
et-orbi (1.1.6)
tzinfo
- excon (0.62.0)
+ excon (0.71.0)
fabrication (2.21.0)
- faker (2.8.0)
+ faker (2.8.1)
i18n (>= 1.6, < 1.8)
faraday (0.15.4)
multipart-post (>= 1.2, < 3)
@@ -324,7 +324,7 @@ GEM
jmespath (1.4.0)
json (2.2.0)
json-canonicalization (0.1.0)
- json-ld-preloaded (3.0.4)
+ json-ld-preloaded (3.0.6)
json-ld (~> 3.0)
multi_json (~> 1.12)
rdf (~> 3.0)
@@ -380,7 +380,7 @@ GEM
mini_portile2 (2.4.0)
minitest (5.13.0)
msgpack (1.3.1)
- multi_json (1.13.1)
+ multi_json (1.14.1)
multipart-post (2.1.1)
necromancer (0.5.1)
net-ldap (0.16.2)
@@ -424,7 +424,7 @@ GEM
av (~> 0.9.0)
paperclip (>= 2.5.2)
parallel (1.19.1)
- parallel_tests (2.29.2)
+ parallel_tests (2.30.0)
parallel
parser (2.6.5.0)
ast (~> 2.4.0)
@@ -469,18 +469,18 @@ GEM
rack
rack-test (1.1.0)
rack (>= 1.0, < 3)
- rails (5.2.3)
- actioncable (= 5.2.3)
- actionmailer (= 5.2.3)
- actionpack (= 5.2.3)
- actionview (= 5.2.3)
- activejob (= 5.2.3)
- activemodel (= 5.2.3)
- activerecord (= 5.2.3)
- activestorage (= 5.2.3)
- activesupport (= 5.2.3)
+ rails (5.2.4)
+ actioncable (= 5.2.4)
+ actionmailer (= 5.2.4)
+ actionpack (= 5.2.4)
+ actionview (= 5.2.4)
+ activejob (= 5.2.4)
+ activemodel (= 5.2.4)
+ activerecord (= 5.2.4)
+ activestorage (= 5.2.4)
+ activesupport (= 5.2.4)
bundler (>= 1.3.0)
- railties (= 5.2.3)
+ railties (= 5.2.4)
sprockets-rails (>= 2.0.0)
rails-controller-testing (1.0.4)
actionpack (>= 5.0.1.x)
@@ -496,15 +496,15 @@ GEM
railties (>= 5.0, < 6)
rails-settings-cached (0.6.6)
rails (>= 4.2.0)
- railties (5.2.3)
- actionpack (= 5.2.3)
- activesupport (= 5.2.3)
+ railties (5.2.4)
+ actionpack (= 5.2.4)
+ activesupport (= 5.2.4)
method_source
rake (>= 0.8.7)
thor (>= 0.19.0, < 2.0)
rainbow (3.0.0)
rake (13.0.1)
- rdf (3.0.12)
+ rdf (3.0.13)
hamster (~> 3.0)
link_header (~> 0.0, >= 0.0.8)
rdf-normalize (0.3.3)
@@ -615,7 +615,7 @@ GEM
sshkit (1.20.0)
net-scp (>= 1.1.2)
net-ssh (>= 2.8.0)
- stackprof (0.2.13)
+ stackprof (0.2.14)
statsd-ruby (1.4.0)
stoplight (2.2.0)
streamio-ffmpeg (3.0.2)
@@ -667,9 +667,9 @@ GEM
webpush (0.3.8)
hkdf (~> 0.2)
jwt (~> 2.0)
- websocket-driver (0.7.0)
+ websocket-driver (0.7.1)
websocket-extensions (>= 0.1.0)
- websocket-extensions (0.1.3)
+ websocket-extensions (0.1.4)
wisper (2.0.1)
xpath (3.2.0)
nokogiri (~> 1.8)
@@ -753,7 +753,7 @@ DEPENDENCIES
paperclip (~> 6.0)
paperclip-av-transcoder (~> 0.6)
parallel (~> 1.19)
- parallel_tests (~> 2.29)
+ parallel_tests (~> 2.30)
parslet
pg (~> 1.1)
pghero (~> 2.4)
@@ -767,7 +767,7 @@ DEPENDENCIES
pundit (~> 2.1)
rack-attack (~> 6.2)
rack-cors (~> 1.1)
- rails (~> 5.2.3)
+ rails (~> 5.2.4)
rails-controller-testing (~> 1.0)
rails-i18n (~> 5.1)
rails-settings-cached (~> 0.6)
@@ -789,6 +789,7 @@ DEPENDENCIES
simple-navigation (~> 4.1)
simple_form (~> 5.0)
simplecov (~> 0.17)
+ sprockets (~> 3.7)
sprockets-rails (~> 3.2)
stackprof
stoplight (~> 2.2.0)
diff --git a/README.md b/README.md
index 54a738c83..995c3911d 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,23 @@
![Mastodon](https://i.imgur.com/NhZc40l.png)
========
+# CipherBliss version of Mastodon
+
+
+features:
+
+* liks to free tools
+* snow fall during the end of the yar.
+
+## Todo
+* proper responsive columning
+* **instant Messaging** in the web front end.
+
+ uses the api to get accounts
+ ```bash
+ GET /api/v1/accounts/[id of my account]/following
+ ```
+
+========
[![GitHub release](https://img.shields.io/github/release/tootsuite/mastodon.svg)][releases]
[![Build Status](https://img.shields.io/circleci/project/github/tootsuite/mastodon.svg)][circleci]
@@ -72,7 +90,7 @@ Mastodon acts as an OAuth2 provider so 3rd party apps can use the REST and Strea
- **Ruby** 2.4+
- **Node.js** 8+
-The repository includes deployment configurations for **Docker and docker-compose**, but also a few specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**stand-alone** installation guide](https://docs.joinmastodon.org/administration/installation/) is available in the documentation.
+The repository includes deployment configurations for **Docker and docker-compose**, but also a few specific platforms like **Heroku**, **Scalingo**, and **Nanobox**. The [**stand-alone** installation guide](https://docs.joinmastodon.org/admin/install/) is available in the documentation.
A **Vagrant** configuration is included for development purposes.
diff --git a/app/javascript/mastodon/actions/accounts.js b/app/javascript/mastodon/actions/accounts.js
index d4a824e2c..b1b7b0678 100644
--- a/app/javascript/mastodon/actions/accounts.js
+++ b/app/javascript/mastodon/actions/accounts.js
@@ -4,75 +4,75 @@ import { importAccount, importFetchedAccount, importFetchedAccounts } from './im
export const ACCOUNT_FETCH_REQUEST = 'ACCOUNT_FETCH_REQUEST';
export const ACCOUNT_FETCH_SUCCESS = 'ACCOUNT_FETCH_SUCCESS';
-export const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL';
+export const ACCOUNT_FETCH_FAIL = 'ACCOUNT_FETCH_FAIL';
export const ACCOUNT_FOLLOW_REQUEST = 'ACCOUNT_FOLLOW_REQUEST';
export const ACCOUNT_FOLLOW_SUCCESS = 'ACCOUNT_FOLLOW_SUCCESS';
-export const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL';
+export const ACCOUNT_FOLLOW_FAIL = 'ACCOUNT_FOLLOW_FAIL';
export const ACCOUNT_UNFOLLOW_REQUEST = 'ACCOUNT_UNFOLLOW_REQUEST';
export const ACCOUNT_UNFOLLOW_SUCCESS = 'ACCOUNT_UNFOLLOW_SUCCESS';
-export const ACCOUNT_UNFOLLOW_FAIL = 'ACCOUNT_UNFOLLOW_FAIL';
+export const ACCOUNT_UNFOLLOW_FAIL = 'ACCOUNT_UNFOLLOW_FAIL';
export const ACCOUNT_BLOCK_REQUEST = 'ACCOUNT_BLOCK_REQUEST';
export const ACCOUNT_BLOCK_SUCCESS = 'ACCOUNT_BLOCK_SUCCESS';
-export const ACCOUNT_BLOCK_FAIL = 'ACCOUNT_BLOCK_FAIL';
+export const ACCOUNT_BLOCK_FAIL = 'ACCOUNT_BLOCK_FAIL';
export const ACCOUNT_UNBLOCK_REQUEST = 'ACCOUNT_UNBLOCK_REQUEST';
export const ACCOUNT_UNBLOCK_SUCCESS = 'ACCOUNT_UNBLOCK_SUCCESS';
-export const ACCOUNT_UNBLOCK_FAIL = 'ACCOUNT_UNBLOCK_FAIL';
+export const ACCOUNT_UNBLOCK_FAIL = 'ACCOUNT_UNBLOCK_FAIL';
export const ACCOUNT_MUTE_REQUEST = 'ACCOUNT_MUTE_REQUEST';
export const ACCOUNT_MUTE_SUCCESS = 'ACCOUNT_MUTE_SUCCESS';
-export const ACCOUNT_MUTE_FAIL = 'ACCOUNT_MUTE_FAIL';
+export const ACCOUNT_MUTE_FAIL = 'ACCOUNT_MUTE_FAIL';
export const ACCOUNT_UNMUTE_REQUEST = 'ACCOUNT_UNMUTE_REQUEST';
export const ACCOUNT_UNMUTE_SUCCESS = 'ACCOUNT_UNMUTE_SUCCESS';
-export const ACCOUNT_UNMUTE_FAIL = 'ACCOUNT_UNMUTE_FAIL';
+export const ACCOUNT_UNMUTE_FAIL = 'ACCOUNT_UNMUTE_FAIL';
export const ACCOUNT_PIN_REQUEST = 'ACCOUNT_PIN_REQUEST';
export const ACCOUNT_PIN_SUCCESS = 'ACCOUNT_PIN_SUCCESS';
-export const ACCOUNT_PIN_FAIL = 'ACCOUNT_PIN_FAIL';
+export const ACCOUNT_PIN_FAIL = 'ACCOUNT_PIN_FAIL';
export const ACCOUNT_UNPIN_REQUEST = 'ACCOUNT_UNPIN_REQUEST';
export const ACCOUNT_UNPIN_SUCCESS = 'ACCOUNT_UNPIN_SUCCESS';
-export const ACCOUNT_UNPIN_FAIL = 'ACCOUNT_UNPIN_FAIL';
+export const ACCOUNT_UNPIN_FAIL = 'ACCOUNT_UNPIN_FAIL';
export const FOLLOWERS_FETCH_REQUEST = 'FOLLOWERS_FETCH_REQUEST';
export const FOLLOWERS_FETCH_SUCCESS = 'FOLLOWERS_FETCH_SUCCESS';
-export const FOLLOWERS_FETCH_FAIL = 'FOLLOWERS_FETCH_FAIL';
+export const FOLLOWERS_FETCH_FAIL = 'FOLLOWERS_FETCH_FAIL';
export const FOLLOWERS_EXPAND_REQUEST = 'FOLLOWERS_EXPAND_REQUEST';
export const FOLLOWERS_EXPAND_SUCCESS = 'FOLLOWERS_EXPAND_SUCCESS';
-export const FOLLOWERS_EXPAND_FAIL = 'FOLLOWERS_EXPAND_FAIL';
+export const FOLLOWERS_EXPAND_FAIL = 'FOLLOWERS_EXPAND_FAIL';
export const FOLLOWING_FETCH_REQUEST = 'FOLLOWING_FETCH_REQUEST';
export const FOLLOWING_FETCH_SUCCESS = 'FOLLOWING_FETCH_SUCCESS';
-export const FOLLOWING_FETCH_FAIL = 'FOLLOWING_FETCH_FAIL';
+export const FOLLOWING_FETCH_FAIL = 'FOLLOWING_FETCH_FAIL';
export const FOLLOWING_EXPAND_REQUEST = 'FOLLOWING_EXPAND_REQUEST';
export const FOLLOWING_EXPAND_SUCCESS = 'FOLLOWING_EXPAND_SUCCESS';
-export const FOLLOWING_EXPAND_FAIL = 'FOLLOWING_EXPAND_FAIL';
+export const FOLLOWING_EXPAND_FAIL = 'FOLLOWING_EXPAND_FAIL';
export const RELATIONSHIPS_FETCH_REQUEST = 'RELATIONSHIPS_FETCH_REQUEST';
export const RELATIONSHIPS_FETCH_SUCCESS = 'RELATIONSHIPS_FETCH_SUCCESS';
-export const RELATIONSHIPS_FETCH_FAIL = 'RELATIONSHIPS_FETCH_FAIL';
+export const RELATIONSHIPS_FETCH_FAIL = 'RELATIONSHIPS_FETCH_FAIL';
export const FOLLOW_REQUESTS_FETCH_REQUEST = 'FOLLOW_REQUESTS_FETCH_REQUEST';
export const FOLLOW_REQUESTS_FETCH_SUCCESS = 'FOLLOW_REQUESTS_FETCH_SUCCESS';
-export const FOLLOW_REQUESTS_FETCH_FAIL = 'FOLLOW_REQUESTS_FETCH_FAIL';
+export const FOLLOW_REQUESTS_FETCH_FAIL = 'FOLLOW_REQUESTS_FETCH_FAIL';
export const FOLLOW_REQUESTS_EXPAND_REQUEST = 'FOLLOW_REQUESTS_EXPAND_REQUEST';
export const FOLLOW_REQUESTS_EXPAND_SUCCESS = 'FOLLOW_REQUESTS_EXPAND_SUCCESS';
-export const FOLLOW_REQUESTS_EXPAND_FAIL = 'FOLLOW_REQUESTS_EXPAND_FAIL';
+export const FOLLOW_REQUESTS_EXPAND_FAIL = 'FOLLOW_REQUESTS_EXPAND_FAIL';
export const FOLLOW_REQUEST_AUTHORIZE_REQUEST = 'FOLLOW_REQUEST_AUTHORIZE_REQUEST';
export const FOLLOW_REQUEST_AUTHORIZE_SUCCESS = 'FOLLOW_REQUEST_AUTHORIZE_SUCCESS';
-export const FOLLOW_REQUEST_AUTHORIZE_FAIL = 'FOLLOW_REQUEST_AUTHORIZE_FAIL';
+export const FOLLOW_REQUEST_AUTHORIZE_FAIL = 'FOLLOW_REQUEST_AUTHORIZE_FAIL';
export const FOLLOW_REQUEST_REJECT_REQUEST = 'FOLLOW_REQUEST_REJECT_REQUEST';
export const FOLLOW_REQUEST_REJECT_SUCCESS = 'FOLLOW_REQUEST_REJECT_SUCCESS';
-export const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL';
+export const FOLLOW_REQUEST_REJECT_FAIL = 'FOLLOW_REQUEST_REJECT_FAIL';
function getFromDB(dispatch, getState, index, id) {
return new Promise((resolve, reject) => {
@@ -106,7 +106,7 @@ export function fetchAccount(id) {
dispatch,
getState,
db.transaction('accounts', 'read').objectStore('accounts').index('id'),
- id
+ id,
).then(() => db.close(), error => {
db.close();
throw error;
@@ -118,29 +118,29 @@ export function fetchAccount(id) {
dispatch(fetchAccountFail(id, error));
});
};
-};
+}
export function fetchAccountRequest(id) {
return {
type: ACCOUNT_FETCH_REQUEST,
id,
};
-};
+}
export function fetchAccountSuccess() {
return {
type: ACCOUNT_FETCH_SUCCESS,
};
-};
+}
export function fetchAccountFail(id, error) {
return {
- type: ACCOUNT_FETCH_FAIL,
+ type : ACCOUNT_FETCH_FAIL,
id,
error,
skipAlert: true,
};
-};
+}
export function followAccount(id, reblogs = true) {
return (dispatch, getState) => {
@@ -155,7 +155,7 @@ export function followAccount(id, reblogs = true) {
dispatch(followAccountFail(error, locked));
});
};
-};
+}
export function unfollowAccount(id) {
return (dispatch, getState) => {
@@ -167,59 +167,59 @@ export function unfollowAccount(id) {
dispatch(unfollowAccountFail(error));
});
};
-};
+}
export function followAccountRequest(id, locked) {
return {
- type: ACCOUNT_FOLLOW_REQUEST,
+ type : ACCOUNT_FOLLOW_REQUEST,
id,
locked,
skipLoading: true,
};
-};
+}
export function followAccountSuccess(relationship, alreadyFollowing) {
return {
- type: ACCOUNT_FOLLOW_SUCCESS,
+ type : ACCOUNT_FOLLOW_SUCCESS,
relationship,
alreadyFollowing,
skipLoading: true,
};
-};
+}
export function followAccountFail(error, locked) {
return {
- type: ACCOUNT_FOLLOW_FAIL,
+ type : ACCOUNT_FOLLOW_FAIL,
error,
locked,
skipLoading: true,
};
-};
+}
export function unfollowAccountRequest(id) {
return {
- type: ACCOUNT_UNFOLLOW_REQUEST,
+ type : ACCOUNT_UNFOLLOW_REQUEST,
id,
skipLoading: true,
};
-};
+}
export function unfollowAccountSuccess(relationship, statuses) {
return {
- type: ACCOUNT_UNFOLLOW_SUCCESS,
+ type : ACCOUNT_UNFOLLOW_SUCCESS,
relationship,
statuses,
skipLoading: true,
};
-};
+}
export function unfollowAccountFail(error) {
return {
- type: ACCOUNT_UNFOLLOW_FAIL,
+ type : ACCOUNT_UNFOLLOW_FAIL,
error,
skipLoading: true,
};
-};
+}
export function blockAccount(id) {
return (dispatch, getState) => {
@@ -232,7 +232,7 @@ export function blockAccount(id) {
dispatch(blockAccountFail(id, error));
});
};
-};
+}
export function unblockAccount(id) {
return (dispatch, getState) => {
@@ -244,14 +244,14 @@ export function unblockAccount(id) {
dispatch(unblockAccountFail(id, error));
});
};
-};
+}
export function blockAccountRequest(id) {
return {
type: ACCOUNT_BLOCK_REQUEST,
id,
};
-};
+}
export function blockAccountSuccess(relationship, statuses) {
return {
@@ -259,36 +259,35 @@ export function blockAccountSuccess(relationship, statuses) {
relationship,
statuses,
};
-};
+}
export function blockAccountFail(error) {
return {
type: ACCOUNT_BLOCK_FAIL,
error,
};
-};
+}
export function unblockAccountRequest(id) {
return {
type: ACCOUNT_UNBLOCK_REQUEST,
id,
};
-};
+}
export function unblockAccountSuccess(relationship) {
return {
type: ACCOUNT_UNBLOCK_SUCCESS,
relationship,
};
-};
+}
export function unblockAccountFail(error) {
return {
type: ACCOUNT_UNBLOCK_FAIL,
error,
};
-};
-
+}
export function muteAccount(id, notifications) {
return (dispatch, getState) => {
@@ -301,7 +300,7 @@ export function muteAccount(id, notifications) {
dispatch(muteAccountFail(id, error));
});
};
-};
+}
export function unmuteAccount(id) {
return (dispatch, getState) => {
@@ -313,14 +312,14 @@ export function unmuteAccount(id) {
dispatch(unmuteAccountFail(id, error));
});
};
-};
+}
export function muteAccountRequest(id) {
return {
type: ACCOUNT_MUTE_REQUEST,
id,
};
-};
+}
export function muteAccountSuccess(relationship, statuses) {
return {
@@ -328,36 +327,35 @@ export function muteAccountSuccess(relationship, statuses) {
relationship,
statuses,
};
-};
+}
export function muteAccountFail(error) {
return {
type: ACCOUNT_MUTE_FAIL,
error,
};
-};
+}
export function unmuteAccountRequest(id) {
return {
type: ACCOUNT_UNMUTE_REQUEST,
id,
};
-};
+}
export function unmuteAccountSuccess(relationship) {
return {
type: ACCOUNT_UNMUTE_SUCCESS,
relationship,
};
-};
+}
export function unmuteAccountFail(error) {
return {
type: ACCOUNT_UNMUTE_FAIL,
error,
};
-};
-
+}
export function fetchFollowers(id) {
return (dispatch, getState) => {
@@ -373,14 +371,14 @@ export function fetchFollowers(id) {
dispatch(fetchFollowersFail(id, error));
});
};
-};
+}
export function fetchFollowersRequest(id) {
return {
type: FOLLOWERS_FETCH_REQUEST,
id,
};
-};
+}
export function fetchFollowersSuccess(id, accounts, next) {
return {
@@ -389,7 +387,7 @@ export function fetchFollowersSuccess(id, accounts, next) {
accounts,
next,
};
-};
+}
export function fetchFollowersFail(id, error) {
return {
@@ -397,7 +395,7 @@ export function fetchFollowersFail(id, error) {
id,
error,
};
-};
+}
export function expandFollowers(id) {
return (dispatch, getState) => {
@@ -419,14 +417,14 @@ export function expandFollowers(id) {
dispatch(expandFollowersFail(id, error));
});
};
-};
+}
export function expandFollowersRequest(id) {
return {
type: FOLLOWERS_EXPAND_REQUEST,
id,
};
-};
+}
export function expandFollowersSuccess(id, accounts, next) {
return {
@@ -435,7 +433,7 @@ export function expandFollowersSuccess(id, accounts, next) {
accounts,
next,
};
-};
+}
export function expandFollowersFail(id, error) {
return {
@@ -443,7 +441,7 @@ export function expandFollowersFail(id, error) {
id,
error,
};
-};
+}
export function fetchFollowing(id) {
return (dispatch, getState) => {
@@ -459,14 +457,14 @@ export function fetchFollowing(id) {
dispatch(fetchFollowingFail(id, error));
});
};
-};
+}
export function fetchFollowingRequest(id) {
return {
type: FOLLOWING_FETCH_REQUEST,
id,
};
-};
+}
export function fetchFollowingSuccess(id, accounts, next) {
return {
@@ -475,7 +473,7 @@ export function fetchFollowingSuccess(id, accounts, next) {
accounts,
next,
};
-};
+}
export function fetchFollowingFail(id, error) {
return {
@@ -483,7 +481,7 @@ export function fetchFollowingFail(id, error) {
id,
error,
};
-};
+}
export function expandFollowing(id) {
return (dispatch, getState) => {
@@ -505,14 +503,14 @@ export function expandFollowing(id) {
dispatch(expandFollowingFail(id, error));
});
};
-};
+}
export function expandFollowingRequest(id) {
return {
type: FOLLOWING_EXPAND_REQUEST,
id,
};
-};
+}
export function expandFollowingSuccess(id, accounts, next) {
return {
@@ -521,7 +519,7 @@ export function expandFollowingSuccess(id, accounts, next) {
accounts,
next,
};
-};
+}
export function expandFollowingFail(id, error) {
return {
@@ -529,7 +527,7 @@ export function expandFollowingFail(id, error) {
id,
error,
};
-};
+}
export function fetchRelationships(accountIds) {
return (dispatch, getState) => {
@@ -548,31 +546,31 @@ export function fetchRelationships(accountIds) {
dispatch(fetchRelationshipsFail(error));
});
};
-};
+}
export function fetchRelationshipsRequest(ids) {
return {
- type: RELATIONSHIPS_FETCH_REQUEST,
+ type : RELATIONSHIPS_FETCH_REQUEST,
ids,
skipLoading: true,
};
-};
+}
export function fetchRelationshipsSuccess(relationships) {
return {
- type: RELATIONSHIPS_FETCH_SUCCESS,
+ type : RELATIONSHIPS_FETCH_SUCCESS,
relationships,
skipLoading: true,
};
-};
+}
export function fetchRelationshipsFail(error) {
return {
- type: RELATIONSHIPS_FETCH_FAIL,
+ type : RELATIONSHIPS_FETCH_FAIL,
error,
skipLoading: true,
};
-};
+}
export function fetchFollowRequests() {
return (dispatch, getState) => {
@@ -584,13 +582,13 @@ export function fetchFollowRequests() {
dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null));
}).catch(error => dispatch(fetchFollowRequestsFail(error)));
};
-};
+}
export function fetchFollowRequestsRequest() {
return {
type: FOLLOW_REQUESTS_FETCH_REQUEST,
};
-};
+}
export function fetchFollowRequestsSuccess(accounts, next) {
return {
@@ -598,14 +596,14 @@ export function fetchFollowRequestsSuccess(accounts, next) {
accounts,
next,
};
-};
+}
export function fetchFollowRequestsFail(error) {
return {
type: FOLLOW_REQUESTS_FETCH_FAIL,
error,
};
-};
+}
export function expandFollowRequests() {
return (dispatch, getState) => {
@@ -623,13 +621,13 @@ export function expandFollowRequests() {
dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null));
}).catch(error => dispatch(expandFollowRequestsFail(error)));
};
-};
+}
export function expandFollowRequestsRequest() {
return {
type: FOLLOW_REQUESTS_EXPAND_REQUEST,
};
-};
+}
export function expandFollowRequestsSuccess(accounts, next) {
return {
@@ -637,14 +635,14 @@ export function expandFollowRequestsSuccess(accounts, next) {
accounts,
next,
};
-};
+}
export function expandFollowRequestsFail(error) {
return {
type: FOLLOW_REQUESTS_EXPAND_FAIL,
error,
};
-};
+}
export function authorizeFollowRequest(id) {
return (dispatch, getState) => {
@@ -655,21 +653,21 @@ export function authorizeFollowRequest(id) {
.then(() => dispatch(authorizeFollowRequestSuccess(id)))
.catch(error => dispatch(authorizeFollowRequestFail(id, error)));
};
-};
+}
export function authorizeFollowRequestRequest(id) {
return {
type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
id,
};
-};
+}
export function authorizeFollowRequestSuccess(id) {
return {
type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
id,
};
-};
+}
export function authorizeFollowRequestFail(id, error) {
return {
@@ -677,8 +675,7 @@ export function authorizeFollowRequestFail(id, error) {
id,
error,
};
-};
-
+}
export function rejectFollowRequest(id) {
return (dispatch, getState) => {
@@ -689,21 +686,21 @@ export function rejectFollowRequest(id) {
.then(() => dispatch(rejectFollowRequestSuccess(id)))
.catch(error => dispatch(rejectFollowRequestFail(id, error)));
};
-};
+}
export function rejectFollowRequestRequest(id) {
return {
type: FOLLOW_REQUEST_REJECT_REQUEST,
id,
};
-};
+}
export function rejectFollowRequestSuccess(id) {
return {
type: FOLLOW_REQUEST_REJECT_SUCCESS,
id,
};
-};
+}
export function rejectFollowRequestFail(id, error) {
return {
@@ -711,7 +708,7 @@ export function rejectFollowRequestFail(id, error) {
id,
error,
};
-};
+}
export function pinAccount(id) {
return (dispatch, getState) => {
@@ -723,7 +720,7 @@ export function pinAccount(id) {
dispatch(pinAccountFail(error));
});
};
-};
+}
export function unpinAccount(id) {
return (dispatch, getState) => {
@@ -735,46 +732,46 @@ export function unpinAccount(id) {
dispatch(unpinAccountFail(error));
});
};
-};
+}
export function pinAccountRequest(id) {
return {
type: ACCOUNT_PIN_REQUEST,
id,
};
-};
+}
export function pinAccountSuccess(relationship) {
return {
type: ACCOUNT_PIN_SUCCESS,
relationship,
};
-};
+}
export function pinAccountFail(error) {
return {
type: ACCOUNT_PIN_FAIL,
error,
};
-};
+}
export function unpinAccountRequest(id) {
return {
type: ACCOUNT_UNPIN_REQUEST,
id,
};
-};
+}
export function unpinAccountSuccess(relationship) {
return {
type: ACCOUNT_UNPIN_SUCCESS,
relationship,
};
-};
+}
export function unpinAccountFail(error) {
return {
type: ACCOUNT_UNPIN_FAIL,
error,
};
-};
+}
diff --git a/app/javascript/mastodon/actions/compose.js b/app/javascript/mastodon/actions/compose.js
index c3c6ff1a1..e80f33526 100644
--- a/app/javascript/mastodon/actions/compose.js
+++ b/app/javascript/mastodon/actions/compose.js
@@ -7,26 +7,25 @@ import { useEmoji } from './emojis';
import resizeImage from '../utils/resize_image';
import { importFetchedAccounts } from './importer';
import { updateTimeline } from './timelines';
-import { showAlertForError } from './alerts';
-import { showAlert } from './alerts';
+import { showAlert, showAlertForError } from './alerts';
import { defineMessages } from 'react-intl';
let cancelFetchComposeSuggestionsAccounts, cancelFetchComposeSuggestionsTags;
-export const COMPOSE_CHANGE = 'COMPOSE_CHANGE';
-export const COMPOSE_SUBMIT_REQUEST = 'COMPOSE_SUBMIT_REQUEST';
-export const COMPOSE_SUBMIT_SUCCESS = 'COMPOSE_SUBMIT_SUCCESS';
-export const COMPOSE_SUBMIT_FAIL = 'COMPOSE_SUBMIT_FAIL';
-export const COMPOSE_REPLY = 'COMPOSE_REPLY';
-export const COMPOSE_REPLY_CANCEL = 'COMPOSE_REPLY_CANCEL';
-export const COMPOSE_DIRECT = 'COMPOSE_DIRECT';
-export const COMPOSE_MENTION = 'COMPOSE_MENTION';
-export const COMPOSE_RESET = 'COMPOSE_RESET';
-export const COMPOSE_UPLOAD_REQUEST = 'COMPOSE_UPLOAD_REQUEST';
-export const COMPOSE_UPLOAD_SUCCESS = 'COMPOSE_UPLOAD_SUCCESS';
-export const COMPOSE_UPLOAD_FAIL = 'COMPOSE_UPLOAD_FAIL';
+export const COMPOSE_CHANGE = 'COMPOSE_CHANGE';
+export const COMPOSE_SUBMIT_REQUEST = 'COMPOSE_SUBMIT_REQUEST';
+export const COMPOSE_SUBMIT_SUCCESS = 'COMPOSE_SUBMIT_SUCCESS';
+export const COMPOSE_SUBMIT_FAIL = 'COMPOSE_SUBMIT_FAIL';
+export const COMPOSE_REPLY = 'COMPOSE_REPLY';
+export const COMPOSE_REPLY_CANCEL = 'COMPOSE_REPLY_CANCEL';
+export const COMPOSE_DIRECT = 'COMPOSE_DIRECT';
+export const COMPOSE_MENTION = 'COMPOSE_MENTION';
+export const COMPOSE_RESET = 'COMPOSE_RESET';
+export const COMPOSE_UPLOAD_REQUEST = 'COMPOSE_UPLOAD_REQUEST';
+export const COMPOSE_UPLOAD_SUCCESS = 'COMPOSE_UPLOAD_SUCCESS';
+export const COMPOSE_UPLOAD_FAIL = 'COMPOSE_UPLOAD_FAIL';
export const COMPOSE_UPLOAD_PROGRESS = 'COMPOSE_UPLOAD_PROGRESS';
-export const COMPOSE_UPLOAD_UNDO = 'COMPOSE_UPLOAD_UNDO';
+export const COMPOSE_UPLOAD_UNDO = 'COMPOSE_UPLOAD_UNDO';
export const COMPOSE_SUGGESTIONS_CLEAR = 'COMPOSE_SUGGESTIONS_CLEAR';
export const COMPOSE_SUGGESTIONS_READY = 'COMPOSE_SUGGESTIONS_READY';
@@ -35,32 +34,32 @@ export const COMPOSE_SUGGESTION_TAGS_UPDATE = 'COMPOSE_SUGGESTION_TAGS_UPDATE';
export const COMPOSE_TAG_HISTORY_UPDATE = 'COMPOSE_TAG_HISTORY_UPDATE';
-export const COMPOSE_MOUNT = 'COMPOSE_MOUNT';
+export const COMPOSE_MOUNT = 'COMPOSE_MOUNT';
export const COMPOSE_UNMOUNT = 'COMPOSE_UNMOUNT';
export const COMPOSE_SENSITIVITY_CHANGE = 'COMPOSE_SENSITIVITY_CHANGE';
export const COMPOSE_SPOILERNESS_CHANGE = 'COMPOSE_SPOILERNESS_CHANGE';
export const COMPOSE_SPOILER_TEXT_CHANGE = 'COMPOSE_SPOILER_TEXT_CHANGE';
-export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE';
+export const COMPOSE_VISIBILITY_CHANGE = 'COMPOSE_VISIBILITY_CHANGE';
export const COMPOSE_LISTABILITY_CHANGE = 'COMPOSE_LISTABILITY_CHANGE';
export const COMPOSE_COMPOSING_CHANGE = 'COMPOSE_COMPOSING_CHANGE';
export const COMPOSE_EMOJI_INSERT = 'COMPOSE_EMOJI_INSERT';
-export const COMPOSE_UPLOAD_CHANGE_REQUEST = 'COMPOSE_UPLOAD_UPDATE_REQUEST';
-export const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS';
-export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL';
+export const COMPOSE_UPLOAD_CHANGE_REQUEST = 'COMPOSE_UPLOAD_UPDATE_REQUEST';
+export const COMPOSE_UPLOAD_CHANGE_SUCCESS = 'COMPOSE_UPLOAD_UPDATE_SUCCESS';
+export const COMPOSE_UPLOAD_CHANGE_FAIL = 'COMPOSE_UPLOAD_UPDATE_FAIL';
-export const COMPOSE_POLL_ADD = 'COMPOSE_POLL_ADD';
-export const COMPOSE_POLL_REMOVE = 'COMPOSE_POLL_REMOVE';
-export const COMPOSE_POLL_OPTION_ADD = 'COMPOSE_POLL_OPTION_ADD';
-export const COMPOSE_POLL_OPTION_CHANGE = 'COMPOSE_POLL_OPTION_CHANGE';
-export const COMPOSE_POLL_OPTION_REMOVE = 'COMPOSE_POLL_OPTION_REMOVE';
+export const COMPOSE_POLL_ADD = 'COMPOSE_POLL_ADD';
+export const COMPOSE_POLL_REMOVE = 'COMPOSE_POLL_REMOVE';
+export const COMPOSE_POLL_OPTION_ADD = 'COMPOSE_POLL_OPTION_ADD';
+export const COMPOSE_POLL_OPTION_CHANGE = 'COMPOSE_POLL_OPTION_CHANGE';
+export const COMPOSE_POLL_OPTION_REMOVE = 'COMPOSE_POLL_OPTION_REMOVE';
export const COMPOSE_POLL_SETTINGS_CHANGE = 'COMPOSE_POLL_SETTINGS_CHANGE';
const messages = defineMessages({
uploadErrorLimit: { id: 'upload_error.limit', defaultMessage: 'File upload limit exceeded.' },
- uploadErrorPoll: { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' },
+ uploadErrorPoll : { id: 'upload_error.poll', defaultMessage: 'File upload not allowed with polls.' },
});
const COMPOSE_PANEL_BREAKPOINT = 600 + (285 * 1) + (10 * 1);
@@ -76,57 +75,57 @@ export function changeCompose(text) {
type: COMPOSE_CHANGE,
text: text,
};
-};
+}
export function replyCompose(status, routerHistory) {
return (dispatch, getState) => {
dispatch({
- type: COMPOSE_REPLY,
+ type : COMPOSE_REPLY,
status: status,
});
ensureComposeIsVisible(getState, routerHistory);
};
-};
+}
export function cancelReplyCompose() {
return {
type: COMPOSE_REPLY_CANCEL,
};
-};
+}
export function resetCompose() {
return {
type: COMPOSE_RESET,
};
-};
+}
export function mentionCompose(account, routerHistory) {
return (dispatch, getState) => {
dispatch({
- type: COMPOSE_MENTION,
+ type : COMPOSE_MENTION,
account: account,
});
ensureComposeIsVisible(getState, routerHistory);
};
-};
+}
export function directCompose(account, routerHistory) {
return (dispatch, getState) => {
dispatch({
- type: COMPOSE_DIRECT,
+ type : COMPOSE_DIRECT,
account: account,
});
ensureComposeIsVisible(getState, routerHistory);
};
-};
+}
export function submitCompose(routerHistory) {
return function (dispatch, getState) {
const status = getState().getIn(['compose', 'text'], '');
- const media = getState().getIn(['compose', 'media_attachments']);
+ const media = getState().getIn(['compose', 'media_attachments']);
if ((!status || !status.length) && media.size === 0) {
return;
@@ -137,11 +136,11 @@ export function submitCompose(routerHistory) {
api(getState).post('/api/v1/statuses', {
status,
in_reply_to_id: getState().getIn(['compose', 'in_reply_to'], null),
- media_ids: media.map(item => item.get('id')),
- sensitive: getState().getIn(['compose', 'sensitive']),
- spoiler_text: getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
- visibility: getState().getIn(['compose', 'privacy']),
- poll: getState().getIn(['compose', 'poll'], null),
+ media_ids : media.map(item => item.get('id')),
+ sensitive : getState().getIn(['compose', 'sensitive']),
+ spoiler_text : getState().getIn(['compose', 'spoiler']) ? getState().getIn(['compose', 'spoiler_text'], '') : '',
+ visibility : getState().getIn(['compose', 'privacy']),
+ poll : getState().getIn(['compose', 'poll'], null),
}, {
headers: {
'Idempotency-Key': getState().getIn(['compose', 'idempotencyKey']),
@@ -179,33 +178,33 @@ export function submitCompose(routerHistory) {
dispatch(submitComposeFail(error));
});
};
-};
+}
export function submitComposeRequest() {
return {
type: COMPOSE_SUBMIT_REQUEST,
};
-};
+}
export function submitComposeSuccess(status) {
return {
- type: COMPOSE_SUBMIT_SUCCESS,
+ type : COMPOSE_SUBMIT_SUCCESS,
status: status,
};
-};
+}
export function submitComposeFail(error) {
return {
- type: COMPOSE_SUBMIT_FAIL,
+ type : COMPOSE_SUBMIT_FAIL,
error: error,
};
-};
+}
export function uploadCompose(files) {
return function (dispatch, getState) {
const uploadLimit = 4;
- const media = getState().getIn(['compose', 'media_attachments']);
- const pending = getState().getIn(['compose', 'pending_media_attachments']);
+ const media = getState().getIn(['compose', 'media_attachments']);
+ const pending = getState().getIn(['compose', 'pending_media_attachments']);
const progress = new Array(files.length).fill(0);
let total = Array.from(files).reduce((a, v) => a + v.size, 0);
@@ -231,15 +230,16 @@ export function uploadCompose(files) {
total += file.size - f.size;
return api(getState).post('/api/v1/media', data, {
- onUploadProgress: function({ loaded }){
+ onUploadProgress: function ({ loaded }) {
progress[i] = loaded;
dispatch(uploadComposeProgress(progress.reduce((a, v) => a + v, 0), total));
},
}).then(({ data }) => dispatch(uploadComposeSuccess(data, f)));
}).catch(error => dispatch(uploadComposeFail(error)));
- };
+ }
+
};
-};
+}
export function changeUploadCompose(id, params) {
return (dispatch, getState) => {
@@ -251,68 +251,69 @@ export function changeUploadCompose(id, params) {
dispatch(changeUploadComposeFail(id, error));
});
};
-};
+}
export function changeUploadComposeRequest() {
return {
- type: COMPOSE_UPLOAD_CHANGE_REQUEST,
+ type : COMPOSE_UPLOAD_CHANGE_REQUEST,
skipLoading: true,
};
-};
+}
+
export function changeUploadComposeSuccess(media) {
return {
- type: COMPOSE_UPLOAD_CHANGE_SUCCESS,
- media: media,
+ type : COMPOSE_UPLOAD_CHANGE_SUCCESS,
+ media : media,
skipLoading: true,
};
-};
+}
export function changeUploadComposeFail(error) {
return {
- type: COMPOSE_UPLOAD_CHANGE_FAIL,
- error: error,
+ type : COMPOSE_UPLOAD_CHANGE_FAIL,
+ error : error,
skipLoading: true,
};
-};
+}
export function uploadComposeRequest() {
return {
- type: COMPOSE_UPLOAD_REQUEST,
+ type : COMPOSE_UPLOAD_REQUEST,
skipLoading: true,
};
-};
+}
export function uploadComposeProgress(loaded, total) {
return {
- type: COMPOSE_UPLOAD_PROGRESS,
+ type : COMPOSE_UPLOAD_PROGRESS,
loaded: loaded,
- total: total,
+ total : total,
};
-};
+}
export function uploadComposeSuccess(media, file) {
return {
- type: COMPOSE_UPLOAD_SUCCESS,
- media: media,
- file: file,
+ type : COMPOSE_UPLOAD_SUCCESS,
+ media : media,
+ file : file,
skipLoading: true,
};
-};
+}
export function uploadComposeFail(error) {
return {
- type: COMPOSE_UPLOAD_FAIL,
- error: error,
+ type : COMPOSE_UPLOAD_FAIL,
+ error : error,
skipLoading: true,
};
-};
+}
export function undoUploadCompose(media_id) {
return {
- type: COMPOSE_UPLOAD_UNDO,
+ type : COMPOSE_UPLOAD_UNDO,
media_id: media_id,
};
-};
+}
export function clearComposeSuggestions() {
if (cancelFetchComposeSuggestionsAccounts) {
@@ -321,7 +322,7 @@ export function clearComposeSuggestions() {
return {
type: COMPOSE_SUGGESTIONS_CLEAR,
};
-};
+}
const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => {
if (cancelFetchComposeSuggestionsAccounts) {
@@ -334,9 +335,9 @@ const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) =>
}),
params: {
- q: token.slice(1),
+ q : token.slice(1),
resolve: false,
- limit: 4,
+ limit : 4,
},
}).then(response => {
dispatch(importFetchedAccounts(response.data));
@@ -366,10 +367,10 @@ const fetchComposeSuggestionsTags = throttle((dispatch, getState, token) => {
}),
params: {
- type: 'hashtags',
- q: token.slice(1),
- resolve: false,
- limit: 4,
+ type : 'hashtags',
+ q : token.slice(1),
+ resolve : false,
+ limit : 4,
exclude_unreviewed: true,
},
}).then(({ data }) => {
@@ -395,7 +396,7 @@ export function fetchComposeSuggestions(token) {
break;
}
};
-};
+}
export function readyComposeSuggestionsEmojis(token, emojis) {
return {
@@ -403,7 +404,7 @@ export function readyComposeSuggestionsEmojis(token, emojis) {
token,
emojis,
};
-};
+}
export function readyComposeSuggestionsAccounts(token, accounts) {
return {
@@ -411,7 +412,7 @@ export function readyComposeSuggestionsAccounts(token, accounts) {
token,
accounts,
};
-};
+}
export const readyComposeSuggestionsTags = (token, tags) => ({
type: COMPOSE_SUGGESTIONS_READY,
@@ -424,27 +425,27 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
let completion, startPosition;
if (suggestion.type === 'emoji') {
- completion = suggestion.native || suggestion.colons;
+ completion = suggestion.native || suggestion.colons;
startPosition = position - 1;
dispatch(useEmoji(suggestion));
} else if (suggestion.type === 'hashtag') {
- completion = `#${suggestion.name}`;
+ completion = `#${suggestion.name}`;
startPosition = position - 1;
} else if (suggestion.type === 'account') {
- completion = getState().getIn(['accounts', suggestion.id, 'acct']);
+ completion = getState().getIn(['accounts', suggestion.id, 'acct']);
startPosition = position;
}
dispatch({
- type: COMPOSE_SUGGESTION_SELECT,
+ type : COMPOSE_SUGGESTION_SELECT,
position: startPosition,
token,
completion,
path,
});
};
-};
+}
export function updateSuggestionTags(token) {
return {
@@ -492,39 +493,39 @@ export function mountCompose() {
return {
type: COMPOSE_MOUNT,
};
-};
+}
export function unmountCompose() {
return {
type: COMPOSE_UNMOUNT,
};
-};
+}
export function changeComposeSensitivity() {
return {
type: COMPOSE_SENSITIVITY_CHANGE,
};
-};
+}
export function changeComposeSpoilerness() {
return {
type: COMPOSE_SPOILERNESS_CHANGE,
};
-};
+}
export function changeComposeSpoilerText(text) {
return {
type: COMPOSE_SPOILER_TEXT_CHANGE,
text,
};
-};
+}
export function changeComposeVisibility(value) {
return {
type: COMPOSE_VISIBILITY_CHANGE,
value,
};
-};
+}
export function insertEmojiCompose(position, emoji, needsSpace) {
return {
@@ -533,33 +534,33 @@ export function insertEmojiCompose(position, emoji, needsSpace) {
emoji,
needsSpace,
};
-};
+}
export function changeComposing(value) {
return {
type: COMPOSE_COMPOSING_CHANGE,
value,
};
-};
+}
export function addPoll() {
return {
type: COMPOSE_POLL_ADD,
};
-};
+}
export function removePoll() {
return {
type: COMPOSE_POLL_REMOVE,
};
-};
+}
export function addPollOption(title) {
return {
type: COMPOSE_POLL_OPTION_ADD,
title,
};
-};
+}
export function changePollOption(index, title) {
return {
@@ -567,14 +568,14 @@ export function changePollOption(index, title) {
index,
title,
};
-};
+}
export function removePollOption(index) {
return {
type: COMPOSE_POLL_OPTION_REMOVE,
index,
};
-};
+}
export function changePollSettings(expiresIn, isMultiple) {
return {
@@ -582,4 +583,4 @@ export function changePollSettings(expiresIn, isMultiple) {
expiresIn,
isMultiple,
};
-};
+}
diff --git a/app/javascript/mastodon/actions/conversations.js b/app/javascript/mastodon/actions/conversations.js
index 4ef654b1f..2027fcb68 100644
--- a/app/javascript/mastodon/actions/conversations.js
+++ b/app/javascript/mastodon/actions/conversations.js
@@ -1,23 +1,19 @@
import api, { getLinks } from '../api';
-import {
- importFetchedAccounts,
- importFetchedStatuses,
- importFetchedStatus,
-} from './importer';
+import { importFetchedAccounts, importFetchedStatus, importFetchedStatuses } from './importer';
-export const CONVERSATIONS_MOUNT = 'CONVERSATIONS_MOUNT';
+export const CONVERSATIONS_MOUNT = 'CONVERSATIONS_MOUNT';
export const CONVERSATIONS_UNMOUNT = 'CONVERSATIONS_UNMOUNT';
export const CONVERSATIONS_FETCH_REQUEST = 'CONVERSATIONS_FETCH_REQUEST';
export const CONVERSATIONS_FETCH_SUCCESS = 'CONVERSATIONS_FETCH_SUCCESS';
-export const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL';
-export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE';
+export const CONVERSATIONS_FETCH_FAIL = 'CONVERSATIONS_FETCH_FAIL';
+export const CONVERSATIONS_UPDATE = 'CONVERSATIONS_UPDATE';
export const CONVERSATIONS_READ = 'CONVERSATIONS_READ';
export const CONVERSATIONS_DELETE_REQUEST = 'CONVERSATIONS_DELETE_REQUEST';
export const CONVERSATIONS_DELETE_SUCCESS = 'CONVERSATIONS_DELETE_SUCCESS';
-export const CONVERSATIONS_DELETE_FAIL = 'CONVERSATIONS_DELETE_FAIL';
+export const CONVERSATIONS_DELETE_FAIL = 'CONVERSATIONS_DELETE_FAIL';
export const mountConversations = () => ({
type: CONVERSATIONS_MOUNT,
@@ -30,7 +26,7 @@ export const unmountConversations = () => ({
export const markConversationRead = conversationId => (dispatch, getState) => {
dispatch({
type: CONVERSATIONS_READ,
- id: conversationId,
+ id : conversationId,
});
api(getState).post(`/api/v1/conversations/${conversationId}/read`);
diff --git a/app/javascript/mastodon/actions/statuses.js b/app/javascript/mastodon/actions/statuses.js
index 06a19afc3..b2f0bf07d 100644
--- a/app/javascript/mastodon/actions/statuses.js
+++ b/app/javascript/mastodon/actions/statuses.js
@@ -3,31 +3,31 @@ import openDB from '../storage/db';
import { evictStatus } from '../storage/modifier';
import { deleteFromTimelines } from './timelines';
-import { importFetchedStatus, importFetchedStatuses, importAccount, importStatus } from './importer';
+import { importAccount, importFetchedStatus, importFetchedStatuses, importStatus } from './importer';
import { ensureComposeIsVisible } from './compose';
export const STATUS_FETCH_REQUEST = 'STATUS_FETCH_REQUEST';
export const STATUS_FETCH_SUCCESS = 'STATUS_FETCH_SUCCESS';
-export const STATUS_FETCH_FAIL = 'STATUS_FETCH_FAIL';
+export const STATUS_FETCH_FAIL = 'STATUS_FETCH_FAIL';
export const STATUS_DELETE_REQUEST = 'STATUS_DELETE_REQUEST';
export const STATUS_DELETE_SUCCESS = 'STATUS_DELETE_SUCCESS';
-export const STATUS_DELETE_FAIL = 'STATUS_DELETE_FAIL';
+export const STATUS_DELETE_FAIL = 'STATUS_DELETE_FAIL';
export const CONTEXT_FETCH_REQUEST = 'CONTEXT_FETCH_REQUEST';
export const CONTEXT_FETCH_SUCCESS = 'CONTEXT_FETCH_SUCCESS';
-export const CONTEXT_FETCH_FAIL = 'CONTEXT_FETCH_FAIL';
+export const CONTEXT_FETCH_FAIL = 'CONTEXT_FETCH_FAIL';
export const STATUS_MUTE_REQUEST = 'STATUS_MUTE_REQUEST';
export const STATUS_MUTE_SUCCESS = 'STATUS_MUTE_SUCCESS';
-export const STATUS_MUTE_FAIL = 'STATUS_MUTE_FAIL';
+export const STATUS_MUTE_FAIL = 'STATUS_MUTE_FAIL';
export const STATUS_UNMUTE_REQUEST = 'STATUS_UNMUTE_REQUEST';
export const STATUS_UNMUTE_SUCCESS = 'STATUS_UNMUTE_SUCCESS';
-export const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL';
+export const STATUS_UNMUTE_FAIL = 'STATUS_UNMUTE_FAIL';
export const STATUS_REVEAL = 'STATUS_REVEAL';
-export const STATUS_HIDE = 'STATUS_HIDE';
+export const STATUS_HIDE = 'STATUS_HIDE';
export const REDRAFT = 'REDRAFT';
@@ -37,7 +37,7 @@ export function fetchStatusRequest(id, skipLoading) {
id,
skipLoading,
};
-};
+}
function getFromDB(dispatch, getState, accountIndex, index, id) {
return new Promise((resolve, reject) => {
@@ -113,24 +113,24 @@ export function fetchStatus(id) {
dispatch(fetchStatusFail(id, error, skipLoading));
});
};
-};
+}
export function fetchStatusSuccess(skipLoading) {
return {
type: STATUS_FETCH_SUCCESS,
skipLoading,
};
-};
+}
export function fetchStatusFail(id, error, skipLoading) {
return {
- type: STATUS_FETCH_FAIL,
+ type : STATUS_FETCH_FAIL,
id,
error,
skipLoading,
skipAlert: true,
};
-};
+}
export function redraft(status, raw_text) {
return {
@@ -138,7 +138,7 @@ export function redraft(status, raw_text) {
status,
raw_text,
};
-};
+}
export function deleteStatus(id, routerHistory, withRedraft = false) {
return (dispatch, getState) => {
@@ -163,29 +163,29 @@ export function deleteStatus(id, routerHistory, withRedraft = false) {
dispatch(deleteStatusFail(id, error));
});
};
-};
+}
export function deleteStatusRequest(id) {
return {
type: STATUS_DELETE_REQUEST,
- id: id,
+ id : id,
};
-};
+}
export function deleteStatusSuccess(id) {
return {
type: STATUS_DELETE_SUCCESS,
- id: id,
+ id : id,
};
-};
+}
export function deleteStatusFail(id, error) {
return {
- type: STATUS_DELETE_FAIL,
- id: id,
+ type : STATUS_DELETE_FAIL,
+ id : id,
error: error,
};
-};
+}
export function fetchContext(id) {
return (dispatch, getState) => {
@@ -203,33 +203,33 @@ export function fetchContext(id) {
dispatch(fetchContextFail(id, error));
});
};
-};
+}
export function fetchContextRequest(id) {
return {
type: CONTEXT_FETCH_REQUEST,
id,
};
-};
+}
export function fetchContextSuccess(id, ancestors, descendants) {
return {
- type: CONTEXT_FETCH_SUCCESS,
+ type : CONTEXT_FETCH_SUCCESS,
id,
ancestors,
descendants,
statuses: ancestors.concat(descendants),
};
-};
+}
export function fetchContextFail(id, error) {
return {
- type: CONTEXT_FETCH_FAIL,
+ type : CONTEXT_FETCH_FAIL,
id,
error,
skipAlert: true,
};
-};
+}
export function muteStatus(id) {
return (dispatch, getState) => {
@@ -241,21 +241,21 @@ export function muteStatus(id) {
dispatch(muteStatusFail(id, error));
});
};
-};
+}
export function muteStatusRequest(id) {
return {
type: STATUS_MUTE_REQUEST,
id,
};
-};
+}
export function muteStatusSuccess(id) {
return {
type: STATUS_MUTE_SUCCESS,
id,
};
-};
+}
export function muteStatusFail(id, error) {
return {
@@ -263,7 +263,7 @@ export function muteStatusFail(id, error) {
id,
error,
};
-};
+}
export function unmuteStatus(id) {
return (dispatch, getState) => {
@@ -275,21 +275,21 @@ export function unmuteStatus(id) {
dispatch(unmuteStatusFail(id, error));
});
};
-};
+}
export function unmuteStatusRequest(id) {
return {
type: STATUS_UNMUTE_REQUEST,
id,
};
-};
+}
export function unmuteStatusSuccess(id) {
return {
type: STATUS_UNMUTE_SUCCESS,
id,
};
-};
+}
export function unmuteStatusFail(id, error) {
return {
@@ -297,7 +297,7 @@ export function unmuteStatusFail(id, error) {
id,
error,
};
-};
+}
export function hideStatus(ids) {
if (!Array.isArray(ids)) {
@@ -308,7 +308,7 @@ export function hideStatus(ids) {
type: STATUS_HIDE,
ids,
};
-};
+}
export function revealStatus(ids) {
if (!Array.isArray(ids)) {
@@ -319,4 +319,4 @@ export function revealStatus(ids) {
type: STATUS_REVEAL,
ids,
};
-};
+}
diff --git a/app/javascript/mastodon/components/account.js b/app/javascript/mastodon/components/account.js
index 2705a6001..ab36fd472 100644
--- a/app/javascript/mastodon/components/account.js
+++ b/app/javascript/mastodon/components/account.js
@@ -37,27 +37,27 @@ class Account extends ImmutablePureComponent {
handleFollow = () => {
this.props.onFollow(this.props.account);
- }
+ };
handleBlock = () => {
this.props.onBlock(this.props.account);
- }
+ };
handleMute = () => {
this.props.onMute(this.props.account);
- }
+ };
handleMuteNotifications = () => {
this.props.onMuteNotifications(this.props.account, true);
- }
+ };
handleUnmuteNotifications = () => {
this.props.onMuteNotifications(this.props.account, false);
- }
+ };
handleAction = () => {
this.props.onActionClick(this.props.account);
- }
+ };
render () {
const { account, intl, hidden, onActionClick, actionIcon, actionTitle } = this.props;
@@ -111,7 +111,10 @@ class Account extends ImmutablePureComponent {
-
+
diff --git a/app/javascript/mastodon/components/avatar.js b/app/javascript/mastodon/components/avatar.js
index 570505833..1cfc4897f 100644
--- a/app/javascript/mastodon/components/avatar.js
+++ b/app/javascript/mastodon/components/avatar.js
@@ -7,16 +7,16 @@ export default class Avatar extends React.PureComponent {
static propTypes = {
account: ImmutablePropTypes.map.isRequired,
- size: PropTypes.number.isRequired,
- style: PropTypes.object,
- inline: PropTypes.bool,
+ size : PropTypes.number.isRequired,
+ style : PropTypes.object,
+ inline : PropTypes.bool,
animate: PropTypes.bool,
};
static defaultProps = {
animate: autoPlayGif,
- size: 20,
- inline: false,
+ size : 20,
+ inline : false,
};
state = {
@@ -26,14 +26,14 @@ export default class Avatar extends React.PureComponent {
handleMouseEnter = () => {
if (this.props.animate) return;
this.setState({ hovering: true });
- }
+ };
handleMouseLeave = () => {
if (this.props.animate) return;
this.setState({ hovering: false });
- }
+ };
- render () {
+ render() {
const { account, size, animate, inline } = this.props;
const { hovering } = this.state;
@@ -48,8 +48,8 @@ export default class Avatar extends React.PureComponent {
const style = {
...this.props.style,
- width: `${size}px`,
- height: `${size}px`,
+ width : `${size}px`,
+ height : `${size}px`,
backgroundSize: `${size}px ${size}px`,
};
diff --git a/app/javascript/mastodon/components/error_boundary.js b/app/javascript/mastodon/components/error_boundary.js
index 800b1c270..6f763619c 100644
--- a/app/javascript/mastodon/components/error_boundary.js
+++ b/app/javascript/mastodon/components/error_boundary.js
@@ -1,7 +1,7 @@
import React from 'react';
import PropTypes from 'prop-types';
import { FormattedMessage } from 'react-intl';
-import { version, source_url } from 'mastodon/initial_state';
+import { source_url, version } from 'mastodon/initial_state';
export default class ErrorBoundary extends React.PureComponent {
@@ -10,17 +10,17 @@ export default class ErrorBoundary extends React.PureComponent {
};
state = {
- hasError: false,
- stackTrace: undefined,
+ hasError : false,
+ stackTrace : undefined,
componentStack: undefined,
};
- componentDidCatch (error, info) {
+ componentDidCatch(error, info) {
this.setState({
- hasError: true,
- stackTrace: error.stack,
+ hasError : true,
+ stackTrace : error.stack,
componentStack: info && info.componentStack,
- copied: false,
+ copied : false,
});
}
@@ -28,7 +28,7 @@ export default class ErrorBoundary extends React.PureComponent {
const { stackTrace } = this.state;
const textarea = document.createElement('textarea');
- textarea.textContent = stackTrace;
+ textarea.textContent = stackTrace;
textarea.style.position = 'fixed';
document.body.appendChild(textarea);
@@ -44,7 +44,7 @@ export default class ErrorBoundary extends React.PureComponent {
this.setState({ copied: true });
setTimeout(() => this.setState({ copied: false }), 700);
- }
+ };
render() {
const { hasError, copied } = this.state;
@@ -54,13 +54,32 @@ export default class ErrorBoundary extends React.PureComponent {
}
return (
-
-
-
-
-
Mastodon v{version} · ·
-
-
+
+
+
+
+
Mastodon v{version} · ·
+
+
);
}
diff --git a/app/javascript/mastodon/components/icon_button.js b/app/javascript/mastodon/components/icon_button.js
index fd715bc3c..47ad42e78 100644
--- a/app/javascript/mastodon/components/icon_button.js
+++ b/app/javascript/mastodon/components/icon_button.js
@@ -6,41 +6,41 @@ import Icon from 'mastodon/components/icon';
export default class IconButton extends React.PureComponent {
static propTypes = {
- className: PropTypes.string,
- title: PropTypes.string.isRequired,
- icon: PropTypes.string.isRequired,
- onClick: PropTypes.func,
+ className : PropTypes.string,
+ title : PropTypes.string.isRequired,
+ icon : PropTypes.string.isRequired,
+ onClick : PropTypes.func,
onMouseDown: PropTypes.func,
- onKeyDown: PropTypes.func,
- onKeyPress: PropTypes.func,
- size: PropTypes.number,
- active: PropTypes.bool,
- pressed: PropTypes.bool,
- expanded: PropTypes.bool,
- style: PropTypes.object,
+ onKeyDown : PropTypes.func,
+ onKeyPress : PropTypes.func,
+ size : PropTypes.number,
+ active : PropTypes.bool,
+ pressed : PropTypes.bool,
+ expanded : PropTypes.bool,
+ style : PropTypes.object,
activeStyle: PropTypes.object,
- disabled: PropTypes.bool,
- inverted: PropTypes.bool,
- animate: PropTypes.bool,
- overlay: PropTypes.bool,
- tabIndex: PropTypes.string,
+ disabled : PropTypes.bool,
+ inverted : PropTypes.bool,
+ animate : PropTypes.bool,
+ overlay : PropTypes.bool,
+ tabIndex : PropTypes.string,
};
static defaultProps = {
- size: 18,
- active: false,
+ size : 18,
+ active : false,
disabled: false,
- animate: false,
- overlay: false,
+ animate : false,
+ overlay : false,
tabIndex: '0',
};
state = {
- activate: false,
+ activate : false,
deactivate: false,
- }
+ };
- componentWillReceiveProps (nextProps) {
+ componentWillReceiveProps(nextProps) {
if (!nextProps.animate) return;
if (this.props.active && !nextProps.active) {
@@ -50,38 +50,38 @@ export default class IconButton extends React.PureComponent {
}
}
- handleClick = (e) => {
+ handleClick = (e) => {
e.preventDefault();
if (!this.props.disabled) {
this.props.onClick(e);
}
- }
+ };
handleKeyPress = (e) => {
if (this.props.onKeyPress && !this.props.disabled) {
this.props.onKeyPress(e);
}
- }
+ };
handleMouseDown = (e) => {
if (!this.props.disabled && this.props.onMouseDown) {
this.props.onMouseDown(e);
}
- }
+ };
handleKeyDown = (e) => {
if (!this.props.disabled && this.props.onKeyDown) {
this.props.onKeyDown(e);
}
- }
+ };
- render () {
+ render() {
const style = {
- fontSize: `${this.props.size}px`,
- width: `${this.props.size * 1.28571429}px`,
- height: `${this.props.size * 1.28571429}px`,
- lineHeight: `${this.props.size}px`,
+ // fontSize: `${this.props.size}px`,
+ // width: `${this.props.size * 1.28571429}px`,
+ // height: `${this.props.size * 1.28571429}px`,
+ // lineHeight: `${this.props.size}px`,
...this.props.style,
...(this.props.active ? this.props.activeStyle : {}),
};
@@ -128,8 +128,12 @@ export default class IconButton extends React.PureComponent {
tabIndex={tabIndex}
disabled={disabled}
>
-
-
+
+
);
}
diff --git a/app/javascript/mastodon/components/status.js b/app/javascript/mastodon/components/status.js
index f1d70ed71..340fa8ad8 100644
--- a/app/javascript/mastodon/components/status.js
+++ b/app/javascript/mastodon/components/status.js
@@ -16,7 +16,7 @@ import { Audio, MediaGallery, Video } from '../features/ui/util/async-components
import { HotKeys } from 'react-hotkeys';
import classNames from 'classnames';
import Icon from 'mastodon/components/icon';
-import { displayMedia } from '../initial_state';
+import { displayMedia, isStaff } from '../initial_state';
// We use the component (and not the container) since we do not want
// to use the progress bar to show download progress
import Bundle from '../features/ui/components/bundle';
@@ -82,11 +82,15 @@ class Status extends ImmutablePureComponent {
onMoveUp : PropTypes.func,
onMoveDown : PropTypes.func,
showThread : PropTypes.bool,
+ threadsCompile : PropTypes.bool,
getScrollPosition : PropTypes.func,
updateScrollBottom: PropTypes.func,
cacheMediaWidth : PropTypes.func,
cachedMediaWidth : PropTypes.number,
};
+ static defaultProps = {
+ threadsCompile: true,
+ };
// Avoid checking props that are functions (and whose equality will always
// evaluate to false. See react-immutable-pure-component for usage.
@@ -199,24 +203,24 @@ class Status extends ImmutablePureComponent {
};
renderLoadingMediaGallery() {
- return
;
+ />);
}
renderLoadingVideoPlayer() {
- return
;
+ />);
}
renderLoadingAudioPlayer() {
- return
;
+ />);
}
handleOpenVideo = (media, startTime) => {
@@ -497,20 +501,20 @@ class Status extends ImmutablePureComponent {
}
if (otherAccounts && otherAccounts.size > 0) {
- statusAvatar =
;
+ size={55}
+ />);
} else if (account === undefined || account === null) {
- statusAvatar =
;
+ size={55}
+ />);
} else {
- statusAvatar =
;
+ />);
}
return (
@@ -542,6 +546,12 @@ class Status extends ImmutablePureComponent {
role='presentation'
/>
+
+ {isStaff && (
+
+
+
+ )}
)}
+ {/*
*/}
+ {/* {status.get('in_reply_to_account_id') === status.getIn(['account', 'id']) &&*/}
+ {/*
oui je cause tout seul, c'est un thread
*/}
+ {/* }*/}
+ {/* {this.props.threadsCompile &&*/}
+ {/*
les threads sont en mode compilés
*/}
+ {/* }*/}
+ {/*
*/}
+ account={account} {...other}
+ />
diff --git a/app/javascript/mastodon/extra_polyfills.js b/app/javascript/mastodon/extra_polyfills.js
index 3acc55abd..13c4f6da9 100644
--- a/app/javascript/mastodon/extra_polyfills.js
+++ b/app/javascript/mastodon/extra_polyfills.js
@@ -1,5 +1,5 @@
import 'intersection-observer';
import 'requestidlecallback';
-import objectFitImages from 'object-fit-images';
+import objectFitImages from 'object-fit-images';
objectFitImages();
diff --git a/app/javascript/mastodon/features/account/components/header.js b/app/javascript/mastodon/features/account/components/header.js
index 8bd7f2db5..7a86a7e01 100644
--- a/app/javascript/mastodon/features/account/components/header.js
+++ b/app/javascript/mastodon/features/account/components/header.js
@@ -1,10 +1,10 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import Button from 'mastodon/components/button';
import ImmutablePureComponent from 'react-immutable-pure-component';
-import { autoPlayGif, me, isStaff } from 'mastodon/initial_state';
+import { autoPlayGif, isStaff, me } from 'mastodon/initial_state';
import classNames from 'classnames';
import Icon from 'mastodon/components/icon';
import Avatar from 'mastodon/components/avatar';
@@ -70,7 +70,7 @@ class Header extends ImmutablePureComponent {
openEditProfile = () => {
window.open('/settings/profile', '_blank');
- }
+ };
isStatusesPageActive = (match, location) => {
if (!match) {
@@ -78,7 +78,7 @@ class Header extends ImmutablePureComponent {
}
return !location.pathname.match(/\/(followers|following)\/?$/);
- }
+ };
_updateEmojis () {
const node = this.node;
@@ -111,15 +111,15 @@ class Header extends ImmutablePureComponent {
handleEmojiMouseEnter = ({ target }) => {
target.src = target.getAttribute('data-original');
- }
+ };
handleEmojiMouseLeave = ({ target }) => {
target.src = target.getAttribute('data-static');
- }
+ };
setRef = (c) => {
this.node = c;
- }
+ };
render () {
const { account, intl, domain, identity_proofs } = this.props;
@@ -263,7 +263,10 @@ class Header extends ImmutablePureComponent {
-
+
diff --git a/app/javascript/mastodon/features/account_timeline/index.js b/app/javascript/mastodon/features/account_timeline/index.js
index 8d0cbe5a1..e823f9510 100644
--- a/app/javascript/mastodon/features/account_timeline/index.js
+++ b/app/javascript/mastodon/features/account_timeline/index.js
@@ -21,12 +21,13 @@ const mapStateToProps = (state, { params: { accountId }, withReplies = false })
const path = withReplies ? `${accountId}:with_replies` : accountId;
return {
- isAccount: !!state.getIn(['accounts', accountId]),
- statusIds: state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
+ isAccount : !!state.getIn(['accounts', accountId]),
+ account : state.getIn(['accounts', accountId]),
+ statusIds : state.getIn(['timelines', `account:${path}`, 'items'], emptyList),
featuredStatusIds: withReplies ? ImmutableList() : state.getIn(['timelines', `account:${accountId}:pinned`, 'items'], emptyList),
- isLoading: state.getIn(['timelines', `account:${path}`, 'isLoading']),
- hasMore: state.getIn(['timelines', `account:${path}`, 'hasMore']),
- blockedBy: state.getIn(['relationships', accountId, 'blocked_by'], false),
+ isLoading : state.getIn(['timelines', `account:${path}`, 'isLoading']),
+ hasMore : state.getIn(['timelines', `account:${path}`, 'hasMore']),
+ blockedBy : state.getIn(['relationships', accountId, 'blocked_by'], false),
};
};
@@ -34,20 +35,20 @@ export default @connect(mapStateToProps)
class AccountTimeline extends ImmutablePureComponent {
static propTypes = {
- params: PropTypes.object.isRequired,
- dispatch: PropTypes.func.isRequired,
+ params : PropTypes.object.isRequired,
+ dispatch : PropTypes.func.isRequired,
shouldUpdateScroll: PropTypes.func,
- statusIds: ImmutablePropTypes.list,
- featuredStatusIds: ImmutablePropTypes.list,
- isLoading: PropTypes.bool,
- hasMore: PropTypes.bool,
- withReplies: PropTypes.bool,
- blockedBy: PropTypes.bool,
- isAccount: PropTypes.bool,
- multiColumn: PropTypes.bool,
+ statusIds : ImmutablePropTypes.list,
+ featuredStatusIds : ImmutablePropTypes.list,
+ isLoading : PropTypes.bool,
+ hasMore : PropTypes.bool,
+ withReplies : PropTypes.bool,
+ blockedBy : PropTypes.bool,
+ isAccount : PropTypes.bool,
+ multiColumn : PropTypes.bool,
};
- componentWillMount () {
+ componentWillMount() {
const { params: { accountId }, withReplies } = this.props;
this.props.dispatch(fetchAccount(accountId));
@@ -60,7 +61,7 @@ class AccountTimeline extends ImmutablePureComponent {
this.props.dispatch(expandAccountTimeline(accountId, { withReplies }));
}
- componentWillReceiveProps (nextProps) {
+ componentWillReceiveProps(nextProps) {
if ((nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) || nextProps.withReplies !== this.props.withReplies) {
this.props.dispatch(fetchAccount(nextProps.params.accountId));
this.props.dispatch(fetchAccountIdentityProofs(nextProps.params.accountId));
@@ -74,33 +75,42 @@ class AccountTimeline extends ImmutablePureComponent {
}
handleLoadMore = maxId => {
- this.props.dispatch(expandAccountTimeline(this.props.params.accountId, { maxId, withReplies: this.props.withReplies }));
- }
+ this.props.dispatch(expandAccountTimeline(this.props.params.accountId, {
+ maxId,
+ withReplies: this.props.withReplies,
+ }));
+ };
- render () {
+ render() {
const { shouldUpdateScroll, statusIds, featuredStatusIds, isLoading, hasMore, blockedBy, isAccount, multiColumn } = this.props;
if (!isAccount) {
return (
-
+
-
+
);
}
if (!statusIds && isLoading) {
return (
-
+
-
+
);
}
- const emptyMessage = blockedBy ?
:
;
+ const emptyMessage = blockedBy ?
:
;
return (
-
+
-
+
);
}
diff --git a/app/javascript/mastodon/features/compose/components/compose_form.js b/app/javascript/mastodon/features/compose/components/compose_form.js
index cacdd2986..b52bffbce 100644
--- a/app/javascript/mastodon/features/compose/components/compose_form.js
+++ b/app/javascript/mastodon/features/compose/components/compose_form.js
@@ -46,6 +46,7 @@ class ComposeForm extends ImmutablePureComponent {
spoilerText : PropTypes.string,
focusDate : PropTypes.instanceOf(Date),
caretPosition : PropTypes.number,
+ maxTootCharsLimit : PropTypes.number,
preselectDate : PropTypes.instanceOf(Date),
isSubmitting : PropTypes.bool,
isChangingUpload : PropTypes.bool,
@@ -64,7 +65,8 @@ class ComposeForm extends ImmutablePureComponent {
};
static defaultProps = {
- showSearch: false,
+ showSearch : false,
+ maxTootCharsLimit: 7777,
};
handleChange = (e) => {
@@ -88,7 +90,7 @@ class ComposeForm extends ImmutablePureComponent {
const { isSubmitting, isChangingUpload, isUploading, anyMedia } = this.props;
const fulltext = [this.props.spoilerText, countableText(this.props.text)].join('');
- if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > 7777 || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {
+ if (isSubmitting || isUploading || isChangingUpload || length(fulltext) > this.props.maxTootCharsLimit || (fulltext.length !== 0 && fulltext.trim().length === 0 && !anyMedia)) {
return;
}
@@ -181,23 +183,26 @@ class ComposeForm extends ImmutablePureComponent {
const { intl, onPaste, showSearch, anyMedia } = this.props;
const disabled = this.props.isSubmitting;
const text = [this.props.spoilerText, countableText(this.props.text)].join('');
- const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > 7777 || (text.length !== 0 && text.trim().length === 0 && !anyMedia);
+ const disabledButton = disabled || this.props.isUploading || this.props.isChangingUpload || length(text) > this.props.maxTootCharsLimit || (text.length !== 0 && text.trim().length === 0 && !anyMedia);
let publishText = '';
if (this.props.privacy === 'private' || this.props.privacy === 'direct') {
publishText =
-
{intl.formatMessage(messages.publish)};
+
{intl.formatMessage(messages.publish)};
} else {
publishText = this.props.privacy !== 'unlisted' ? intl.formatMessage(messages.publishLoud, { publish: intl.formatMessage(messages.publish) }) : intl.formatMessage(messages.publish);
}
return (
+
+
+
+
+
+
+
+
+ text={publishText}
+ onClick={this.handleSubmit}
+ disabled={disabledButton}
+ block
+ />
+
-
+
);
}
diff --git a/app/javascript/mastodon/features/compose/components/navigation_bar.js b/app/javascript/mastodon/features/compose/components/navigation_bar.js
index d7c9c9818..4f3fc90f4 100644
--- a/app/javascript/mastodon/features/compose/components/navigation_bar.js
+++ b/app/javascript/mastodon/features/compose/components/navigation_bar.js
@@ -26,7 +26,7 @@ export default class NavigationBar extends ImmutablePureComponent {
{this.props.account.get('acct')}
diff --git a/app/javascript/mastodon/features/compose/components/poll_form.js b/app/javascript/mastodon/features/compose/components/poll_form.js
index e9bbb4ba4..907bf1839 100644
--- a/app/javascript/mastodon/features/compose/components/poll_form.js
+++ b/app/javascript/mastodon/features/compose/components/poll_form.js
@@ -2,7 +2,7 @@ import React from 'react';
import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import ImmutablePureComponent from 'react-immutable-pure-component';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import IconButton from 'mastodon/components/icon_button';
import Icon from 'mastodon/components/icon';
import AutosuggestInput from 'mastodon/components/autosuggest_input';
@@ -56,19 +56,19 @@ class Option extends React.PureComponent {
if (e.key === 'Enter' || e.key === ' ') {
this.handleToggleMultiple(e);
}
- }
+ };
onSuggestionsClearRequested = () => {
this.props.onClearSuggestions();
- }
+ };
onSuggestionsFetchRequested = (token) => {
this.props.onFetchSuggestions(token);
- }
+ };
onSuggestionSelected = (tokenStart, token, value) => {
this.props.onSuggestionSelected(tokenStart, token, value, ['poll', 'options', this.props.index]);
- }
+ };
render () {
const { isPollMultiple, title, index, intl } = this.props;
@@ -82,8 +82,8 @@ class Option extends React.PureComponent {
onKeyPress={this.handleCheckboxKeypress}
role='button'
tabIndex='0'
- title={intl.formatMessage(isPollMultiple ? messages.switchToMultiple : messages.switchToSingle)}
- aria-label={intl.formatMessage(isPollMultiple ? messages.switchToMultiple : messages.switchToSingle)}
+ title={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}
+ aria-label={intl.formatMessage(isPollMultiple ? messages.switchToSingle : messages.switchToMultiple)}
/>
({
- text: state.getIn(['compose', 'text']),
- suggestions: state.getIn(['compose', 'suggestions']),
- spoiler: state.getIn(['compose', 'spoiler']),
- spoilerText: state.getIn(['compose', 'spoiler_text']),
- privacy: state.getIn(['compose', 'privacy']),
- focusDate: state.getIn(['compose', 'focusDate']),
- caretPosition: state.getIn(['compose', 'caretPosition']),
- preselectDate: state.getIn(['compose', 'preselectDate']),
- isSubmitting: state.getIn(['compose', 'is_submitting']),
+ text : state.getIn(['compose', 'text']),
+ suggestions : state.getIn(['compose', 'suggestions']),
+ spoiler : state.getIn(['compose', 'spoiler']),
+ spoilerText : state.getIn(['compose', 'spoiler_text']),
+ privacy : state.getIn(['compose', 'privacy']),
+ focusDate : state.getIn(['compose', 'focusDate']),
+ caretPosition : state.getIn(['compose', 'caretPosition']),
+ preselectDate : state.getIn(['compose', 'preselectDate']),
+ isSubmitting : state.getIn(['compose', 'is_submitting']),
isChangingUpload: state.getIn(['compose', 'is_changing_upload']),
- isUploading: state.getIn(['compose', 'is_uploading']),
- showSearch: state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),
- anyMedia: state.getIn(['compose', 'media_attachments']).size > 0,
+ isUploading : state.getIn(['compose', 'is_uploading']),
+ showSearch : state.getIn(['search', 'submitted']) && !state.getIn(['search', 'hidden']),
+ anyMedia : state.getIn(['compose', 'media_attachments']).size > 0,
});
const mapDispatchToProps = (dispatch) => ({
- onChange (text) {
+ onChange(text) {
dispatch(changeCompose(text));
},
- onSubmit (router) {
+ onSubmit(router) {
dispatch(submitCompose(router));
},
- onClearSuggestions () {
+ onClearSuggestions() {
dispatch(clearComposeSuggestions());
},
- onFetchSuggestions (token) {
+ onFetchSuggestions(token) {
dispatch(fetchComposeSuggestions(token));
},
- onSuggestionSelected (position, token, suggestion, path) {
+ onSuggestionSelected(position, token, suggestion, path) {
dispatch(selectComposeSuggestion(position, token, suggestion, path));
},
- onChangeSpoilerText (checked) {
+ onChangeSpoilerText(checked) {
dispatch(changeComposeSpoilerText(checked));
},
- onPaste (files) {
+ onPaste(files) {
dispatch(uploadCompose(files));
},
- onPickEmoji (position, data, needsSpace) {
+ onPickEmoji(position, data, needsSpace) {
dispatch(insertEmojiCompose(position, data, needsSpace));
},
diff --git a/app/javascript/mastodon/features/direct_timeline/components/conversation.js b/app/javascript/mastodon/features/direct_timeline/components/conversation.js
index 221988ecd..f1ab5f950 100644
--- a/app/javascript/mastodon/features/direct_timeline/components/conversation.js
+++ b/app/javascript/mastodon/features/direct_timeline/components/conversation.js
@@ -150,7 +150,7 @@ class Conversation extends ImmutablePureComponent {
menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDelete });
- const names = accounts.map(a => (
- ).reduce((prev, cur) => [prev, ', ', cur]);
+ )).reduce((prev, cur) => [prev, ', ', cur]);
const handlers = {
reply : this.handleReply,
@@ -179,7 +179,7 @@ class Conversation extends ImmutablePureComponent {
@@ -221,23 +221,24 @@ class Conversation extends ImmutablePureComponent {
)}
diff --git a/app/javascript/mastodon/features/directory/components/account_card.js b/app/javascript/mastodon/features/directory/components/account_card.js
index 50ad74450..828527d03 100644
--- a/app/javascript/mastodon/features/directory/components/account_card.js
+++ b/app/javascript/mastodon/features/directory/components/account_card.js
@@ -9,10 +9,10 @@ import DisplayName from 'mastodon/components/display_name';
import Permalink from 'mastodon/components/permalink';
import RelativeTimestamp from 'mastodon/components/relative_timestamp';
import IconButton from 'mastodon/components/icon_button';
-import { FormattedMessage, injectIntl, defineMessages } from 'react-intl';
+import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import { autoPlayGif, me, unfollowModal } from 'mastodon/initial_state';
import { shortNumberFormat } from 'mastodon/utils/numbers';
-import { followAccount, unfollowAccount, blockAccount, unblockAccount, unmuteAccount } from 'mastodon/actions/accounts';
+import { blockAccount, followAccount, unblockAccount, unfollowAccount, unmuteAccount } from 'mastodon/actions/accounts';
import { openModal } from 'mastodon/actions/modal';
import { initMuteModal } from 'mastodon/actions/mutes';
@@ -113,27 +113,27 @@ class AccountCard extends ImmutablePureComponent {
handleEmojiMouseEnter = ({ target }) => {
target.src = target.getAttribute('data-original');
- }
+ };
handleEmojiMouseLeave = ({ target }) => {
target.src = target.getAttribute('data-static');
- }
+ };
handleFollow = () => {
this.props.onFollow(this.props.account);
- }
+ };
handleBlock = () => {
this.props.onBlock(this.props.account);
- }
+ };
handleMute = () => {
this.props.onMute(this.props.account);
- }
+ };
setRef = (c) => {
this.node = c;
- }
+ };
render () {
const { account, intl } = this.props;
@@ -165,7 +165,10 @@ class AccountCard extends ImmutablePureComponent {
-
+
diff --git a/app/javascript/mastodon/features/follow_requests/components/account_authorize.js b/app/javascript/mastodon/features/follow_requests/components/account_authorize.js
index a3b524db1..87b403e7c 100644
--- a/app/javascript/mastodon/features/follow_requests/components/account_authorize.js
+++ b/app/javascript/mastodon/features/follow_requests/components/account_authorize.js
@@ -31,7 +31,10 @@ class AccountAuthorize extends ImmutablePureComponent {
-
+
diff --git a/app/javascript/mastodon/features/following/index.js b/app/javascript/mastodon/features/following/index.js
index 284ae2c11..304935902 100644
--- a/app/javascript/mastodon/features/following/index.js
+++ b/app/javascript/mastodon/features/following/index.js
@@ -5,11 +5,7 @@ import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import { debounce } from 'lodash';
import LoadingIndicator from '../../components/loading_indicator';
-import {
- fetchAccount,
- fetchFollowing,
- expandFollowing,
-} from '../../actions/accounts';
+import { expandFollowing, fetchAccount, fetchFollowing } from '../../actions/accounts';
import { FormattedMessage } from 'react-intl';
import AccountContainer from '../../containers/account_container';
import Column from '../ui/components/column';
@@ -19,34 +15,34 @@ import ScrollableList from '../../components/scrollable_list';
import MissingIndicator from 'mastodon/components/missing_indicator';
const mapStateToProps = (state, props) => ({
- isAccount: !!state.getIn(['accounts', props.params.accountId]),
+ isAccount : !!state.getIn(['accounts', props.params.accountId]),
accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
- hasMore: !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
- blockedBy: state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
+ hasMore : !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
+ blockedBy : state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
});
export default @connect(mapStateToProps)
class Following extends ImmutablePureComponent {
static propTypes = {
- params: PropTypes.object.isRequired,
- dispatch: PropTypes.func.isRequired,
+ params : PropTypes.object.isRequired,
+ dispatch : PropTypes.func.isRequired,
shouldUpdateScroll: PropTypes.func,
- accountIds: ImmutablePropTypes.list,
- hasMore: PropTypes.bool,
- blockedBy: PropTypes.bool,
- isAccount: PropTypes.bool,
- multiColumn: PropTypes.bool,
+ accountIds : ImmutablePropTypes.list,
+ hasMore : PropTypes.bool,
+ blockedBy : PropTypes.bool,
+ isAccount : PropTypes.bool,
+ multiColumn : PropTypes.bool,
};
- componentWillMount () {
+ componentWillMount() {
if (!this.props.accountIds) {
this.props.dispatch(fetchAccount(this.props.params.accountId));
this.props.dispatch(fetchFollowing(this.props.params.accountId));
}
}
- componentWillReceiveProps (nextProps) {
+ componentWillReceiveProps(nextProps) {
if (nextProps.params.accountId !== this.props.params.accountId && nextProps.params.accountId) {
this.props.dispatch(fetchAccount(nextProps.params.accountId));
this.props.dispatch(fetchFollowing(nextProps.params.accountId));
@@ -57,29 +53,35 @@ class Following extends ImmutablePureComponent {
this.props.dispatch(expandFollowing(this.props.params.accountId));
}, 300, { leading: true });
- render () {
+ render() {
const { shouldUpdateScroll, accountIds, hasMore, blockedBy, isAccount, multiColumn } = this.props;
if (!isAccount) {
return (
-
+
-
+
);
}
if (!accountIds) {
return (
-
+
-
+
);
}
- const emptyMessage = blockedBy ?
:
;
+ const emptyMessage = blockedBy ? (
) : (
);
return (
-
+
}
+ prepend={}
alwaysPrepend
emptyMessage={emptyMessage}
bindToDocument={!multiColumn}
>
{blockedBy ? [] : accountIds.map(id =>
-
+ (),
)}
-
-
+
+
);
}
diff --git a/app/javascript/mastodon/features/notifications/components/notification.js b/app/javascript/mastodon/features/notifications/components/notification.js
index 74065e5e2..0ff64725e 100644
--- a/app/javascript/mastodon/features/notifications/components/notification.js
+++ b/app/javascript/mastodon/features/notifications/components/notification.js
@@ -1,6 +1,6 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
-import { injectIntl, FormattedMessage, defineMessages } from 'react-intl';
+import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import { HotKeys } from 'react-hotkeys';
import PropTypes from 'prop-types';
import ImmutablePureComponent from 'react-immutable-pure-component';
@@ -13,10 +13,10 @@ import Permalink from 'mastodon/components/permalink';
const messages = defineMessages({
favourite: { id: 'notification.favourite', defaultMessage: '{name} favourited your status' },
- follow: { id: 'notification.follow', defaultMessage: '{name} followed you' },
- ownPoll: { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' },
- poll: { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' },
- reblog: { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },
+ follow : { id: 'notification.follow', defaultMessage: '{name} followed you' },
+ ownPoll : { id: 'notification.own_poll', defaultMessage: 'Your poll has ended' },
+ poll : { id: 'notification.poll', defaultMessage: 'A poll you have voted in has ended' },
+ reblog : { id: 'notification.reblog', defaultMessage: '{name} boosted your status' },
});
const notificationForScreenReader = (intl, message, timestamp) => {
@@ -35,31 +35,31 @@ class Notification extends ImmutablePureComponent {
};
static propTypes = {
- notification: ImmutablePropTypes.map.isRequired,
- hidden: PropTypes.bool,
- onMoveUp: PropTypes.func.isRequired,
- onMoveDown: PropTypes.func.isRequired,
- onMention: PropTypes.func.isRequired,
- onFavourite: PropTypes.func.isRequired,
- onReblog: PropTypes.func.isRequired,
- onToggleHidden: PropTypes.func.isRequired,
- status: ImmutablePropTypes.map,
- intl: PropTypes.object.isRequired,
- getScrollPosition: PropTypes.func,
+ notification : ImmutablePropTypes.map.isRequired,
+ hidden : PropTypes.bool,
+ onMoveUp : PropTypes.func.isRequired,
+ onMoveDown : PropTypes.func.isRequired,
+ onMention : PropTypes.func.isRequired,
+ onFavourite : PropTypes.func.isRequired,
+ onReblog : PropTypes.func.isRequired,
+ onToggleHidden : PropTypes.func.isRequired,
+ status : ImmutablePropTypes.map,
+ intl : PropTypes.object.isRequired,
+ getScrollPosition : PropTypes.func,
updateScrollBottom: PropTypes.func,
- cacheMediaWidth: PropTypes.func,
- cachedMediaWidth: PropTypes.number,
+ cacheMediaWidth : PropTypes.func,
+ cachedMediaWidth : PropTypes.number,
};
handleMoveUp = () => {
const { notification, onMoveUp } = this.props;
onMoveUp(notification.get('id'));
- }
+ };
handleMoveDown = () => {
const { notification, onMoveDown } = this.props;
onMoveDown(notification.get('id'));
- }
+ };
handleOpen = () => {
const { notification } = this.props;
@@ -69,94 +69,131 @@ class Notification extends ImmutablePureComponent {
} else {
this.handleOpenProfile();
}
- }
+ };
handleOpenProfile = () => {
const { notification } = this.props;
this.context.router.history.push(`/accounts/${notification.getIn(['account', 'id'])}`);
- }
+ };
handleMention = e => {
e.preventDefault();
const { notification, onMention } = this.props;
onMention(notification.get('account'), this.context.router.history);
- }
+ };
handleHotkeyFavourite = () => {
const { status } = this.props;
if (status) this.props.onFavourite(status);
- }
+ };
handleHotkeyBoost = e => {
const { status } = this.props;
if (status) this.props.onReblog(status, e);
- }
+ };
handleHotkeyToggleHidden = () => {
const { status } = this.props;
if (status) this.props.onToggleHidden(status);
- }
+ };
- getHandlers () {
+ getHandlers() {
return {
- reply: this.handleMention,
- favourite: this.handleHotkeyFavourite,
- boost: this.handleHotkeyBoost,
- mention: this.handleMention,
- open: this.handleOpen,
- openProfile: this.handleOpenProfile,
- moveUp: this.handleMoveUp,
- moveDown: this.handleMoveDown,
+ reply : this.handleMention,
+ favourite : this.handleHotkeyFavourite,
+ boost : this.handleHotkeyBoost,
+ mention : this.handleMention,
+ open : this.handleOpen,
+ openProfile : this.handleOpenProfile,
+ moveUp : this.handleMoveUp,
+ moveDown : this.handleMoveDown,
toggleHidden: this.handleHotkeyToggleHidden,
};
}
- renderFollow (notification, account, link) {
+ renderFollow(notification, account, link) {
const { intl } = this.props;
return (
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
);
}
- renderFollowRequest (notification, account, link) {
+ renderFollowRequest(notification, account, link) {
const { intl } = this.props;
return (
-
-
-
-
+
+
+
);
}
- renderMention (notification) {
+ renderMention(notification) {
return (
-
-
-
+
+
);
}
- renderReblog (notification, link) {
+ renderReblog(notification, link) {
const { intl } = this.props;
return (
-
-
-
+
+
);
}
- renderPoll (notification, account) {
+ renderPoll(notification, account) {
const { intl } = this.props;
- const ownPoll = me === account.get('id');
- const message = ownPoll ? intl.formatMessage(messages.ownPoll) : intl.formatMessage(messages.poll);
+ const ownPoll = me === account.get('id');
+ const message = ownPoll ? intl.formatMessage(messages.ownPoll) : intl.formatMessage(messages.poll);
return (
-
+
{ownPoll ? (
-
+
) : (
-
+
)}
-
-
+
+
-
-
+
+
);
}
- render () {
+ render() {
const { notification } = this.props;
- const account = notification.get('account');
- const displayNameHtml = { __html: account.get('display_name_html') };
- const link = ;
+ const account = notification.get('account');
+ const displayNameHtml = { __html: account.get('display_name_html') };
+ const link = ();
- switch(notification.get('type')) {
+ switch (notification.get('type')) {
case 'follow':
return this.renderFollow(notification, account, link);
case 'follow_request':
diff --git a/app/javascript/mastodon/features/reblogs/index.js b/app/javascript/mastodon/features/reblogs/index.js
index 9179e51db..80fecf964 100644
--- a/app/javascript/mastodon/features/reblogs/index.js
+++ b/app/javascript/mastodon/features/reblogs/index.js
@@ -5,7 +5,7 @@ import PropTypes from 'prop-types';
import ImmutablePropTypes from 'react-immutable-proptypes';
import LoadingIndicator from '../../components/loading_indicator';
import { fetchReblogs } from '../../actions/interactions';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import AccountContainer from '../../containers/account_container';
import Column from '../ui/components/column';
import ScrollableList from '../../components/scrollable_list';
@@ -25,15 +25,15 @@ export default @connect(mapStateToProps)
class Reblogs extends ImmutablePureComponent {
static propTypes = {
- params: PropTypes.object.isRequired,
- dispatch: PropTypes.func.isRequired,
+ params : PropTypes.object.isRequired,
+ dispatch : PropTypes.func.isRequired,
shouldUpdateScroll: PropTypes.func,
- accountIds: ImmutablePropTypes.list,
- multiColumn: PropTypes.bool,
- intl: PropTypes.object.isRequired,
+ accountIds : ImmutablePropTypes.list,
+ multiColumn : PropTypes.bool,
+ intl : PropTypes.object.isRequired,
};
- componentWillMount () {
+ componentWillMount() {
if (!this.props.accountIds) {
this.props.dispatch(fetchReblogs(this.props.params.statusId));
}
@@ -47,20 +47,23 @@ class Reblogs extends ImmutablePureComponent {
handleRefresh = () => {
this.props.dispatch(fetchReblogs(this.props.params.statusId));
- }
+ };
- render () {
+ render() {
const { intl, shouldUpdateScroll, accountIds, multiColumn } = this.props;
if (!accountIds) {
return (
-
+
-
+
);
}
- const emptyMessage = ;
+ const emptyMessage = ();
return (
@@ -68,7 +71,12 @@ class Reblogs extends ImmutablePureComponent {
showBackButton
multiColumn={multiColumn}
extraButton={(
-
+
)}
/>
@@ -79,10 +87,14 @@ class Reblogs extends ImmutablePureComponent {
bindToDocument={!multiColumn}
>
{accountIds.map(id =>
-
+ (),
)}
-
-
+
+
);
}
diff --git a/app/javascript/mastodon/features/status/components/detailed_status.js b/app/javascript/mastodon/features/status/components/detailed_status.js
index d5bc82735..6952382be 100644
--- a/app/javascript/mastodon/features/status/components/detailed_status.js
+++ b/app/javascript/mastodon/features/status/components/detailed_status.js
@@ -45,15 +45,15 @@ export default class DetailedStatus extends ImmutablePureComponent {
}
e.stopPropagation();
- }
+ };
handleOpenVideo = (media, startTime) => {
this.props.onOpenVideo(media, startTime);
- }
+ };
handleExpandedToggle = () => {
this.props.onToggleHidden(this.props.status);
- }
+ };
_measureHeight (heightJustChanged) {
if (this.props.measureHeight && this.node) {
@@ -68,7 +68,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
setRef = c => {
this.node = c;
this._measureHeight();
- }
+ };
componentDidUpdate (prevProps, prevState) {
this._measureHeight(prevState.height !== this.state.height);
@@ -86,7 +86,7 @@ export default class DetailedStatus extends ImmutablePureComponent {
}
window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');
- }
+ };
render () {
const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;
@@ -211,8 +211,14 @@ export default class DetailedStatus extends ImmutablePureComponent {
-
-
+
+
diff --git a/app/javascript/mastodon/features/status/index.js b/app/javascript/mastodon/features/status/index.js
index 6cec4d7e9..936142f10 100644
--- a/app/javascript/mastodon/features/status/index.js
+++ b/app/javascript/mastodon/features/status/index.js
@@ -551,8 +551,9 @@ class Status extends ImmutablePureComponent {
className={classNames('scrollable', { fullscreen })}
ref={this.setRef}
>
+ {/*
ancestors:
*/}
{ancestors}
-
+ {/*
common:
*/}
-
+ {/*
Descendants:
*/}
{descendants}
diff --git a/app/javascript/mastodon/features/ui/components/actions_modal.js b/app/javascript/mastodon/features/ui/components/actions_modal.js
index 875b2b75d..dcd59cfcd 100644
--- a/app/javascript/mastodon/features/ui/components/actions_modal.js
+++ b/app/javascript/mastodon/features/ui/components/actions_modal.js
@@ -26,16 +26,29 @@ export default class ActionsModal extends ImmutablePureComponent {
return (
-
- {icon && }
-
-
-
+
+ {icon && }
+
+
+
);
- }
+ };
render () {
const status = this.props.status && (
@@ -49,7 +62,10 @@ export default class ActionsModal extends ImmutablePureComponent {
diff --git a/app/javascript/mastodon/features/ui/components/boost_modal.js b/app/javascript/mastodon/features/ui/components/boost_modal.js
index 0e79005f0..eb8439a19 100644
--- a/app/javascript/mastodon/features/ui/components/boost_modal.js
+++ b/app/javascript/mastodon/features/ui/components/boost_modal.js
@@ -1,7 +1,7 @@
import React from 'react';
import ImmutablePropTypes from 'react-immutable-proptypes';
import PropTypes from 'prop-types';
-import { defineMessages, injectIntl, FormattedMessage } from 'react-intl';
+import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
import Button from '../../../components/button';
import StatusContent from '../../../components/status_content';
import Avatar from '../../../components/avatar';
@@ -37,7 +37,7 @@ class BoostModal extends ImmutablePureComponent {
handleReblog = () => {
this.props.onReblog(this.props.status);
this.props.onClose();
- }
+ };
handleAccountClick = (e) => {
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
@@ -45,11 +45,11 @@ class BoostModal extends ImmutablePureComponent {
this.props.onClose();
this.context.router.history.push(`/accounts/${this.props.status.getIn(['account', 'id'])}`);
}
- }
+ };
setRef = (c) => {
this.button = c;
- }
+ };
render () {
const { status, intl } = this.props;
@@ -66,7 +66,10 @@ class BoostModal extends ImmutablePureComponent {
diff --git a/app/javascript/mastodon/features/ui/components/columns_area.js b/app/javascript/mastodon/features/ui/components/columns_area.js
index 6149da970..2f825547e 100644
--- a/app/javascript/mastodon/features/ui/components/columns_area.js
+++ b/app/javascript/mastodon/features/ui/components/columns_area.js
@@ -31,6 +31,8 @@ import NavigationPanel from './navigation_panel';
import detectPassiveEvents from 'detect-passive-events';
import { scrollRight } from '../../../scroll';
+import LinkFooter from './link_footer';
+import InstantMessaging from './messaging/instantMessaging';
const componentMap = {
'COMPOSE' : Compose,
@@ -157,10 +159,10 @@ class ColumnsArea extends ImmutablePureComponent {
const view = (index === columnIndex) ?
React.cloneElement(this.props.children) :
- ;
+ />);
return (
;
+ >
);
const content = columnIndex !== -1 ? (
+
@@ -233,8 +238,12 @@ class ColumnsArea extends ImmutablePureComponent {
-
+
{floatingActionButton}
+
+
+
+
);
}
@@ -255,17 +264,20 @@ class ColumnsArea extends ImmutablePureComponent {
loading={this.renderLoading(column.get('id'))}
error={this.renderError}
>
- {SpecificComponent => (}
+ multiColumn {...other}
+ />)}
+
);
})}
{React.Children.map(children, child => React.cloneElement(child, { multiColumn: true }))}
- );
+ )
+ ;
}
}
diff --git a/app/javascript/mastodon/features/ui/components/compose_panel.js b/app/javascript/mastodon/features/ui/components/compose_panel.js
index c7821f473..fd7d7710b 100644
--- a/app/javascript/mastodon/features/ui/components/compose_panel.js
+++ b/app/javascript/mastodon/features/ui/components/compose_panel.js
@@ -2,15 +2,13 @@ import React from 'react';
import SearchContainer from 'mastodon/features/compose/containers/search_container';
import ComposeFormContainer from 'mastodon/features/compose/containers/compose_form_container';
import NavigationContainer from 'mastodon/features/compose/containers/navigation_container';
-import LinkFooter from './link_footer';
const ComposePanel = () => (
-
-
+
);
export default ComposePanel;
diff --git a/app/javascript/mastodon/features/ui/components/link_footer.js b/app/javascript/mastodon/features/ui/components/link_footer.js
index c484dd7bc..1c102ac28 100644
--- a/app/javascript/mastodon/features/ui/components/link_footer.js
+++ b/app/javascript/mastodon/features/ui/components/link_footer.js
@@ -2,10 +2,11 @@ import { connect } from 'react-redux';
import React from 'react';
import PropTypes from 'prop-types';
import { defineMessages, FormattedMessage, injectIntl } from 'react-intl';
-import { Link } from 'react-router-dom';
+import { Link, NavLink } from 'react-router-dom';
import { invitesEnabled, repository, source_url, version } from 'mastodon/initial_state';
import { logOut } from 'mastodon/utils/log_out';
import { openModal } from 'mastodon/actions/modal';
+import { isStaff } from '../../../initial_state';
const messages = defineMessages({
logoutMessage: { id: 'confirmations.logout.message', defaultMessage: 'Are you sure you want to log out?' },
@@ -22,14 +23,26 @@ const mapDispatchToProps = (dispatch, { intl }) => ({
},
});
+// const displaythemetoggler = true;
export default @injectIntl
@connect(null, mapDispatchToProps)
class LinkFooter extends React.PureComponent {
static propTypes = {
- withHotkeys: PropTypes.bool,
- onLogout : PropTypes.func.isRequired,
- intl : PropTypes.object.isRequired,
+ enableChristmasSnow : PropTypes.bool,
+ minimumWeekToShowSnow: PropTypes.number,
+ snowActive : PropTypes.bool,
+ withHotkeys : PropTypes.bool,
+ snow : PropTypes.func,
+ themeIsDark : PropTypes.bool,
+ theme : PropTypes.string,
+ onLogout : PropTypes.func.isRequired,
+ intl : PropTypes.object.isRequired,
+ };
+ static defaultProps = {
+ enableChristmasSnow : true,
+ themeIsDark : true,
+ minimumWeekToShowSnow: 48,
};
handleLogoutClick = e => {
@@ -41,35 +54,177 @@ class LinkFooter extends React.PureComponent {
return false;
};
+ constructor(props) {
+ super(props);
+ Date.prototype.getWeek = function () {
+ var onejan = new Date(this.getFullYear(), 0, 1);
+ return Math.ceil((((this - onejan) / 86400000) + onejan.getDay() + 1) / 7);
+ };
+
+ var weekNumber = (new Date()).getWeek();
+ // display snow during the last two weeks of the year
+ const shouldWeDisplaySnow = (weekNumber > props.minimumWeekToShowSnow) && props.enableChristmasSnow;
+
+ this.state = {
+ enableChristmasSnow: shouldWeDisplaySnow,
+ theme : props.theme,
+ };
+
+ // make snow effect
+ if (shouldWeDisplaySnow) {
+ import('../../../utils/snowstorm-min')
+ .then((snowstorm) => {
+ Window.snowstorm = snowstorm.default;
+ this.state.snow = Window.snowstorm;
+ // snowstorm.start();
+ this.state.snowActive = true;
+ })
+ .catch((err) => console.error(err));
+ }
+
+ }
+
+ toggleSnow = () => {
+ if (this.state.snow) {
+ if (this.state.snowActive) {
+ this.state.snow.stop();
+ this.state.enableChristmasSnow = false;
+ } else {
+ this.state.snow.start();
+ this.state.enableChristmasSnow = true;
+ }
+ }
+ };
+
+ changeTheme(newTheme) {
+ console.log('change theme en ', newTheme);
+ }
+
render() {
+ const HashTagNavlinks = ['Mastoart', 'OpenStreetMaps', 'Ironèmes', 'vélo'];
const { withHotkeys } = this.props;
+ var snowClasses = this.props.enableChristmasSnow ? 'snow-button active' : 'snow-button ';
+ const navToTags = HashTagNavlinks.map(element => {
+ return (
+
+
+
+ #{element}
+
+
+ );
+ });
return (
-
-
- -
- Supportez Cipherbliss
-
- -
+
+
+
+
+
+ {/*
*/}
+
+ {this.state.enableChristmasSnow && (
+
+
+
+
+
Joyeuses fêtes!
+
+
+ )}
+ {isStaff && (
+
+
+ example link
+
+
+
+ Trending hashtags
+
+
+
+ Comptes
+
+
+ )}
+
+
+
+
+
+ {invitesEnabled && (
+ -
+
+ ·
+
+ )}
{withHotkeys && -
- messagerie todo
-
- );
- // const contactlist = this.props.following.foreEach(elem => (
- // -
- //
- // Machin
- //
- // 3 min
- //
- // ));
- // return (
- //
- //
- //
- //
- // Messaging box
- //
- //
- //
- //
- //
- //
- // );
- }
-
-};
diff --git a/app/javascript/mastodon/features/ui/components/messaging/Contact.js b/app/javascript/mastodon/features/ui/components/messaging/Contact.js
new file mode 100644
index 000000000..c04b765d8
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/Contact.js
@@ -0,0 +1,65 @@
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import PropTypes from 'prop-types';
+import React from 'react';
+import Permalink from '../../../../components/permalink';
+
+export default class Contact extends ImmutablePureComponent {
+
+ static propTypes = {
+ account: PropTypes.object,
+ };
+ static defaultProps = {};
+
+ constructor(props) {
+ super(props);
+ this.state = {
+ account: this.props.account,
+ };
+ }
+
+ openConversationWithAccount = (accountId) => {
+ dispatchEvent({ type: 'openConversation', target: accountId });
+ };
+
+ render() {
+ const account = this.props.account;
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+ {this.props.account.username}
+
+
+
+
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/messaging/contacts-list.js b/app/javascript/mastodon/features/ui/components/messaging/contacts-list.js
new file mode 100644
index 000000000..3ccaf4394
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/contacts-list.js
@@ -0,0 +1,142 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import accounts, { me } from '../../../../initial_state';
+import api from '../../../../api';
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import { mockContactList } from './mocks/mockContactList';
+import Contact from './Contact';
+import classNames from 'classnames';
+
+export default class ContactsList extends ImmutablePureComponent {
+
+ static propTypes = {
+ myAccount : PropTypes.array,
+ showList : PropTypes.bool,
+ contactList : PropTypes.array,
+ conversationList: PropTypes.array,
+ following_count : PropTypes.number,
+ };
+ static defaultProps = {
+ showList : true,
+ myAccount : null,
+ userID : me,
+ following_count : 0,
+ contactList : mockContactList,
+ conversationList: mockContactList,
+ };
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ following_count : accounts.accounts[me].following_count,
+ showList : props.showList,
+ myAccount : accounts.accounts[me],
+ contactList : mockContactList,
+ conversationList: mockContactList,
+ };
+ // this.fetchContacts(1);
+ }
+
+ submitCompose() {
+ console.log('submit message');
+ }
+
+ toggleList = () => {
+ this.setState((state) => {
+ return {
+ showList: !state.showList,
+ };
+ });
+ };
+
+ /**
+ * find followed accounts
+ * @param AccountID
+ * @returns {Promise | void>}
+ */
+ fetchContacts = (AccountID = me) => {
+ return api(this.getState()).get('/api/v1/accounts/' + AccountID + '/following').then(resp => {
+ console.log('resp', resp);
+ }).catch(err => console.error('err', err));
+ };
+
+ render() {
+
+ let renderedList = (
+ no contacts
+ );
+ if (this.props.contactList) {
+ renderedList = this.props.contactList.map(account => {
+ return (
+ -
+
+
+ );
+ });
+ }
+
+ const showListClass = (this.state.showList ? 'active' : 'inactive');
+ const classList = 'btn btn-primary toggle-list ' + showListClass;
+ return (
+
+
+ {/**/}
+ {/**/}
+
+
+
+ {this.state.following_count} contacts
+
+
+
+
+ {this.state.showList && (
+
+ )}
+
+
+
+
+ );
+ };
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/messaging/conversation-item.js b/app/javascript/mastodon/features/ui/components/messaging/conversation-item.js
new file mode 100644
index 000000000..61ff47545
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/conversation-item.js
@@ -0,0 +1,116 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import ConversationStream from './conversation-stream';
+
+/**
+ * a conversation between the current logged in user and one recipient
+ */
+export default class ConversationItem extends React.PureComponent {
+
+ static propTypes = {
+ messages : PropTypes.array, // our and their message sorted chronologically
+ recipient : PropTypes.any, // account of the person we talk to, not current logged in account
+ newMessages: PropTypes.number,
+ displayed : PropTypes.bool,
+ };
+ static defaultProps = {
+ newMessages: 0,
+ displayed : true,
+ };
+ following = [];
+
+ constructor(props) {
+ super(props);
+ console.log('props', props);
+ this.state = {
+ composeMessage: '',
+ displayed : this.props.displayed,
+ newMessages : this.props.newMessages,
+ isFocused : false,
+ };
+ }
+
+ submitCompose = (e) => {
+ e.preventDefault();
+
+ console.log('submit');
+ };
+
+ toggleVisibility = () => {
+ this.setState({ 'displayed': !this.state.displayed });
+ };
+ toggleFocused = () => {
+ this.setState({ 'isFocused': !this.state.isFocused });
+ };
+
+ handleChange = (e) => {
+ e.preventDefault();
+ console.log('e', e);
+ };
+
+ render() {
+ const hasNewClass = this.state.newMessages ? 'has-new-message' : 'nothing-new';
+ const isVisible = this.state.displayed ? 'displayed' : 'hidden';
+ const isFocused = this.state.isFocused ? 'isFocused' : 'not-focused';
+ const list = (
+ -
+
+
+
+ {this.props.recipient.username}
+
+ {/**/}
+ {this.props.newMessages > 0 && (
+
+ ({this.props.newMessages})
+
+ )}
+
+
+
+
+
+
+
+ );
+ return (
+
+ );
+
+ }
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/messaging/conversation-stream.js b/app/javascript/mastodon/features/ui/components/messaging/conversation-stream.js
new file mode 100644
index 000000000..9a4fe5bf2
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/conversation-stream.js
@@ -0,0 +1,41 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+
+export default class ConversationStream extends React.PureComponent {
+
+ static propTypes = {
+ messages: PropTypes.array,
+ };
+
+ render() {
+ let messagesLists = (
+
+ no messages
+
+ );
+
+ if (this.props.messages) {
+
+ messagesLists = this.props.messages.map(message => {
+ return (
+ -
+
{message.text}
+
+
+ );
+ });
+
+ }
+ return (
+
+ );
+ }
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/messaging/conversationStack.js b/app/javascript/mastodon/features/ui/components/messaging/conversationStack.js
new file mode 100644
index 000000000..e8f9f53a5
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/conversationStack.js
@@ -0,0 +1,51 @@
+import React from 'react';
+
+import PropTypes from 'prop-types';
+import ConversationItem from './conversation-item';
+import { mockRecipient, mockRecipient2 } from './mocks/mockConversation';
+
+export default class ConversationStack extends React.Component {
+
+ static propTypes = {
+ conversations: PropTypes.array,
+ };
+
+ static defaultProps = {
+ conversations: [mockRecipient, mockRecipient2],
+ };
+
+ openConversationWith(account) {
+ console.log('openConversationWith name', account.username);
+ }
+
+ render() {
+ let list = this.props.conversations.map(recipient => {
+
+ console.log('recipient', recipient);
+ recipient = recipient[0];
+ return (
+ -
+
+
+ );
+
+ },
+ )
+ ;
+ return (
+
+
+ );
+ };
+
+}
diff --git a/app/javascript/mastodon/features/ui/components/messaging/instantMessaging.js b/app/javascript/mastodon/features/ui/components/messaging/instantMessaging.js
new file mode 100644
index 000000000..774cf150d
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/instantMessaging.js
@@ -0,0 +1,60 @@
+import React from 'react';
+
+import ImmutablePureComponent from 'react-immutable-pure-component';
+import PropTypes from 'prop-types';
+import ImmutablePropTypes from 'react-immutable-proptypes';
+import ContactsList from './contacts-list';
+import ConversationStack from './conversationStack';
+
+const mapStateToProps = (state, props) => ({
+ isAccount : !!state.getIn(['accounts', props.params.accountId]),
+ accountIds: state.getIn(['user_lists', 'following', props.params.accountId, 'items']),
+ hasMore : !!state.getIn(['user_lists', 'following', props.params.accountId, 'next']),
+ blockedBy : state.getIn(['relationships', props.params.accountId, 'blocked_by'], false),
+});
+// @connect(mapStateToProps)
+/**
+ * main component for IM, gathers contact list and list of conversations
+ */
+export default class InstantMessaging extends ImmutablePureComponent {
+
+ static propTypes = {
+ // params : PropTypes.object.isRequired,
+ dispatch : PropTypes.func.isRequired,
+ shouldUpdateScroll: PropTypes.func,
+ accountIds : ImmutablePropTypes.list,
+ hasMore : PropTypes.bool,
+ blockedBy : PropTypes.bool,
+ isAccount : PropTypes.bool,
+ multiColumn : PropTypes.bool,
+ };
+ // static defaultProps = {
+ // threadsCompile: true,
+ // };
+ // openConversationWith(account) {
+ // let conversationFound = account;
+ // if conversation exist, focus on it
+ // if (conversationFound) {
+ //
+ // } else {
+ //
+ // }
+ // else, create conversation and focus on it
+ // };
+
+ // submitCompose() {
+ //
+ // };
+
+ render() {
+
+ return (
+
+
+
+
+
+ );
+ }
+
+};
diff --git a/app/javascript/mastodon/features/ui/components/messaging/mocks/mockContactList.js b/app/javascript/mastodon/features/ui/components/messaging/mocks/mockContactList.js
new file mode 100644
index 000000000..d2606e07c
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/mocks/mockContactList.js
@@ -0,0 +1,69 @@
+export const mockContactList = [{
+ 'key' : '2',
+ 'id' : '2',
+ 'username' : 'demoguy',
+ 'acct' : 'demoguy',
+ 'display_name' : '',
+ 'locked' : false,
+ 'bot' : false,
+ 'discoverable' : null,
+ 'group' : false,
+ 'created_at' : '2019-12-18T11:02:26.494Z',
+ 'note' : '',
+ 'url' : 'http://localhost:3000/@demoguy',
+ 'avatar' : 'http://localhost:3000/avatars/original/missing.png',
+ 'avatar_static' : 'http://localhost:3000/avatars/original/missing.png',
+ 'header' : 'http://localhost:3000/headers/original/missing.png',
+ 'header_static' : 'http://localhost:3000/headers/original/missing.png',
+ 'followers_count' : 1,
+ 'following_count' : 1,
+ 'statuses_count' : 8,
+ 'last_status_at' : '2019-12-23T15:20:31.575Z',
+ 'emojis' : [],
+ 'fields' : [],
+ 'display_name_html': 'demoguy',
+ 'note_emojified' : '',
+}, {
+ 'key' : '1',
+ 'id' : '1',
+ 'username' : 'admin',
+ 'acct' : 'admin',
+ 'display_name' : '',
+ 'locked' : true,
+ 'bot' : false,
+ 'discoverable' : true,
+ 'group' : false,
+ 'created_at' : '2019-12-10T13:19:44.106Z',
+ 'note' : '',
+ 'url' : 'http://localhost:3000/@admin',
+ 'avatar' : 'http://localhost:3000/system/accounts/avatars/000/000/001/original/a1497a4af5fd8616.png?1576254102',
+ 'avatar_static' : 'http://localhost:3000/system/accounts/avatars/000/000/001/original/a1497a4af5fd8616.png?1576254102',
+ 'header' : 'http://localhost:3000/system/accounts/headers/000/000/001/original/f13ebf964b09ed26.png?1576254102',
+ 'header_static' : 'http://localhost:3000/system/accounts/headers/000/000/001/original/f13ebf964b09ed26.png?1576254102',
+ 'followers_count' : 4,
+ 'following_count' : 3,
+ 'statuses_count' : 31,
+ 'last_status_at' : '2020-01-04T15:13:32.824Z',
+ 'emojis' : [],
+ 'fields' : [
+ {
+ 'name' : 'sssss',
+ 'value' : 'muuuuu',
+ 'verified_at' : null,
+ 'name_emojified' : 'sssss',
+ 'value_emojified': 'muuuuu',
+ 'value_plain' : 'muuuuu',
+ },
+ ],
+ 'display_name_html': 'admin',
+ 'note_emojified' : '',
+}];
+export const mockContactListShort = [{
+ 'key' : '2',
+ 'id' : '2',
+ 'username': 'demoguy',
+}, {
+ 'key' : '1',
+ 'id' : '1',
+ 'username': 'admin',
+}];
diff --git a/app/javascript/mastodon/features/ui/components/messaging/mocks/mockConversation.js b/app/javascript/mastodon/features/ui/components/messaging/mocks/mockConversation.js
new file mode 100644
index 000000000..b8ceb709f
--- /dev/null
+++ b/app/javascript/mastodon/features/ui/components/messaging/mocks/mockConversation.js
@@ -0,0 +1,33 @@
+export const mockMessages = [
+ { id: 0, text: 'oh hello there! 😋 ', who: 'theirs' },
+ { id: 1, text: 'General Emoji', who: 'ours' },
+ { id: 2, text: 'we just achieved comedy', who: 'theirs' },
+ ]
+;
+export const mockMessages2 = [
+ { id: 0, text: 'oh oh oh ', who: 'theirs' },
+ { id: 1, text: 'General Emoji', who: 'ours' },
+ { id: 2, text: 'DANGER!!', who: 'theirs' },
+ { id: 3, text: 'JUST KIDDING WILL ROBINSON.', who: 'theirs' },
+ ]
+;
+
+export const mockRecipient = [
+ {
+ id : 3,
+ username : 'chuck norris',
+ newMessages: 5,
+ messages : mockMessages,
+ },
+ ]
+;
+
+export const mockRecipient2 = [
+ {
+ id : 4,
+ username : 'the Bo Botte',
+ newMessages: 0,
+ messages : mockMessages2,
+ },
+ ]
+;
diff --git a/app/javascript/mastodon/features/ui/components/navigation_panel.js b/app/javascript/mastodon/features/ui/components/navigation_panel.js
index 7d78a1736..4775e9aa7 100644
--- a/app/javascript/mastodon/features/ui/components/navigation_panel.js
+++ b/app/javascript/mastodon/features/ui/components/navigation_panel.js
@@ -8,24 +8,53 @@ import FollowRequestsNavLink from './follow_requests_nav_link';
import ListPanel from './list_panel';
import TrendsContainer from 'mastodon/features/getting_started/containers/trends_container';
-const showMessaging = true;
-
const NavigationPanel = () => (
+
+
+
-
+
+
+
+
(
id='tabs_bar.notifications'
defaultMessage='Notifications'
/>
-
-
-
(
id='navigation_bar.direct'
defaultMessage='Direct messages'
/>
+
+
+
+
(
{showTrends && }
{showTrends && }
- {/*{showMessaging && }*/}
- {/**/}
);
diff --git a/app/javascript/mastodon/features/ui/components/tabs_bar.js b/app/javascript/mastodon/features/ui/components/tabs_bar.js
index 1911da8ba..480812fed 100644
--- a/app/javascript/mastodon/features/ui/components/tabs_bar.js
+++ b/app/javascript/mastodon/features/ui/components/tabs_bar.js
@@ -8,19 +8,81 @@ import Icon from 'mastodon/components/icon';
import NotificationsCounterIcon from './notifications_counter_icon';
export const links = [
- ,
- ,
- ,
- ,
- ,
- ,
+ ,
+ ,
+ ,
+ ,
+ ,
+ ,
];
-export function getIndex (path) {
+export function getIndex(path) {
return links.findIndex(link => link.props.to === path);
}
-export function getLink (index) {
+export function getLink(index) {
return links[index].props.to;
}
@@ -29,13 +91,13 @@ export default @injectIntl
class TabsBar extends React.PureComponent {
static propTypes = {
- intl: PropTypes.object.isRequired,
+ intl : PropTypes.object.isRequired,
history: PropTypes.object.isRequired,
- }
+ };
setRef = ref => {
this.node = ref;
- }
+ };
handleClick = (e) => {
// Only apply optimization for touch devices, which we assume are slower
@@ -50,7 +112,6 @@ class TabsBar extends React.PureComponent {
const nextTab = tabs.find(tab => tab.contains(e.target));
const { props: { to } } = links[Array(...this.node.childNodes).indexOf(nextTab)];
-
if (currentTab !== nextTab) {
if (currentTab) {
currentTab.classList.remove('active');
@@ -67,19 +128,28 @@ class TabsBar extends React.PureComponent {
});
}
- }
+ };
- render () {
+ render() {
const { intl: { formatMessage } } = this.props;
return (
-
+
+
-
+
+
);
}
diff --git a/app/javascript/mastodon/features/ui/index.js b/app/javascript/mastodon/features/ui/index.js
index 957e80737..8fab1ee7d 100644
--- a/app/javascript/mastodon/features/ui/index.js
+++ b/app/javascript/mastodon/features/ui/index.js
@@ -10,112 +10,118 @@ import LoadingBarContainer from './containers/loading_bar_container';
import ModalContainer from './containers/modal_container';
import { isMobile } from '../../is_mobile';
import { debounce } from 'lodash';
-import { uploadCompose, resetCompose } from '../../actions/compose';
+import { resetCompose, uploadCompose } from '../../actions/compose';
import { expandHomeTimeline } from '../../actions/timelines';
import { expandNotifications } from '../../actions/notifications';
import { fetchFilters } from '../../actions/filters';
import { clearHeight } from '../../actions/height_cache';
import { focusApp, unfocusApp } from 'mastodon/actions/app';
import { submitMarkers } from 'mastodon/actions/markers';
-import { WrappedSwitch, WrappedRoute } from './util/react_router_helpers';
+import { WrappedRoute, WrappedSwitch } from './util/react_router_helpers';
import UploadArea from './components/upload_area';
import ColumnsAreaContainer from './containers/columns_area_container';
import DocumentTitle from './components/document_title';
import {
- Compose,
- Status,
- GettingStarted,
- KeyboardShortcuts,
- PublicTimeline,
- CommunityTimeline,
- AccountTimeline,
AccountGallery,
- HomeTimeline,
+ AccountTimeline,
+ Blocks,
+ BookmarkedStatuses,
+ CommunityTimeline,
+ Compose,
+ Directory,
+ DirectTimeline,
+ DomainBlocks,
+ FavouritedStatuses,
+ Favourites,
Followers,
Following,
- Reblogs,
- Favourites,
- DirectTimeline,
- HashtagTimeline,
- Notifications,
FollowRequests,
GenericNotFound,
- FavouritedStatuses,
- BookmarkedStatuses,
- ListTimeline,
- Blocks,
- DomainBlocks,
- Mutes,
- PinnedStatuses,
+ GettingStarted,
+ HashtagTimeline,
+ HomeTimeline,
+ KeyboardShortcuts,
Lists,
+ ListTimeline,
+ Mutes,
+ Notifications,
+ PinnedStatuses,
+ PublicTimeline,
+ Reblogs,
Search,
- Directory,
+ Status,
} from './util/async-components';
-import { me, forceSingleColumn } from '../../initial_state';
+import { forceSingleColumn, me } from '../../initial_state';
import { previewState as previewMediaState } from './components/media_modal';
import { previewState as previewVideoState } from './components/video_modal';
-
// Dummy import, to make sure that ends up in the application bundle.
// Without this it ends up in ~8 very commonly used bundles.
import '../../components/status';
+import InstantMessaging from './components/messaging/instantMessaging';
const messages = defineMessages({
beforeUnload: { id: 'ui.beforeunload', defaultMessage: 'Your draft will be lost if you leave Mastodon.' },
});
const mapStateToProps = state => ({
- isComposing: state.getIn(['compose', 'is_composing']),
- hasComposingText: state.getIn(['compose', 'text']).trim().length !== 0,
+ isComposing : state.getIn(['compose', 'is_composing']),
+ hasComposingText : state.getIn(['compose', 'text']).trim().length !== 0,
hasMediaAttachments: state.getIn(['compose', 'media_attachments']).size > 0,
- canUploadMore: !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < 4,
- dropdownMenuIsOpen: state.getIn(['dropdown_menu', 'openId']) !== null,
+ canUploadMore : !state.getIn(['compose', 'media_attachments']).some(x => ['audio', 'video'].includes(x.get('type'))) && state.getIn(['compose', 'media_attachments']).size < 4,
+ dropdownMenuIsOpen : state.getIn(['dropdown_menu', 'openId']) !== null,
});
const keyMap = {
- help: '?',
- new: 'n',
- search: 's',
- forceNew: 'option+n',
- focusColumn: ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
- reply: 'r',
- favourite: 'f',
- boost: 'b',
- mention: 'm',
- open: ['enter', 'o'],
- openProfile: 'p',
- moveDown: ['down', 'j'],
- moveUp: ['up', 'k'],
- back: 'backspace',
- goToHome: 'g h',
+ help : '?',
+ new : 'n',
+ search : 's',
+ forceNew : 'option+n',
+ focusColumn : ['1', '2', '3', '4', '5', '6', '7', '8', '9'],
+ reply : 'r',
+ favourite : 'f',
+ boost : 'b',
+ mention : 'm',
+ open : ['enter', 'o'],
+ openProfile : 'p',
+ moveDown : ['down', 'j'],
+ moveUp : ['up', 'k'],
+ back : 'backspace',
+ goToHome : 'g h',
goToNotifications: 'g n',
- goToLocal: 'g l',
- goToFederated: 'g t',
- goToDirect: 'g d',
- goToStart: 'g s',
- goToFavourites: 'g f',
- goToPinned: 'g p',
- goToProfile: 'g u',
- goToBlocked: 'g b',
- goToMuted: 'g m',
- goToRequests: 'g r',
- toggleHidden: 'x',
- toggleSensitive: 'h',
- openMedia: 'e',
+ goToLocal : 'g l',
+ goToFederated : 'g t',
+ goToDirect : 'g d',
+ goToStart : 'g s',
+ goToFavourites : 'g f',
+ goToPinned : 'g p',
+ goToProfile : 'g u',
+ goToBlocked : 'g b',
+ goToMuted : 'g m',
+ goToRequests : 'g r',
+ toggleHidden : 'x',
+ toggleSensitive : 'h',
+ openMedia : 'e',
};
class SwitchingColumnsArea extends React.PureComponent {
static propTypes = {
- children: PropTypes.node,
- location: PropTypes.object,
+ children : PropTypes.node,
+ location : PropTypes.object,
onLayoutChange: PropTypes.func.isRequired,
};
state = {
mobile: isMobile(window.innerWidth),
};
+ handleLayoutChange = debounce(() => {
+ // The cached heights are no longer accurate, invalidate
+ this.props.onLayoutChange();
+ }, 500, {
+ trailing: true,
+ });
- componentWillMount () {
+ componentWillMount() {
window.addEventListener('resize', this.handleResize, { passive: true });
if (this.state.mobile || forceSingleColumn) {
@@ -127,7 +133,7 @@ class SwitchingColumnsArea extends React.PureComponent {
}
}
- componentDidUpdate (prevProps, prevState) {
+ componentDidUpdate(prevProps, prevState) {
if (![this.props.location.pathname, '/'].includes(prevProps.location.pathname)) {
this.node.handleChildrenContentChange();
}
@@ -138,21 +144,14 @@ class SwitchingColumnsArea extends React.PureComponent {
}
}
- componentWillUnmount () {
+ componentWillUnmount() {
window.removeEventListener('resize', this.handleResize);
}
- shouldUpdateScroll (_, { location }) {
+ shouldUpdateScroll(_, { location }) {
return location.state !== previewMediaState && location.state !== previewVideoState;
}
- handleLayoutChange = debounce(() => {
- // The cached heights are no longer accurate, invalidate
- this.props.onLayoutChange();
- }, 500, {
- trailing: true,
- })
-
handleResize = () => {
const mobile = isMobile(window.innerWidth);
@@ -163,61 +162,219 @@ class SwitchingColumnsArea extends React.PureComponent {
} else {
this.handleLayoutChange();
}
- }
+ };
setRef = c => {
if (c) {
this.node = c.getWrappedInstance();
}
- }
+ };
- render () {
+ render() {
const { children } = this.props;
const { mobile } = this.state;
const singleColumn = forceSingleColumn || mobile;
- const redirect = singleColumn ? : ;
+ const redirect = singleColumn ? () : ();
return (
-
-
+
+
{redirect}
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
);
}
@@ -233,15 +390,15 @@ class UI extends React.PureComponent {
};
static propTypes = {
- dispatch: PropTypes.func.isRequired,
- children: PropTypes.node,
- isComposing: PropTypes.bool,
- hasComposingText: PropTypes.bool,
+ dispatch : PropTypes.func.isRequired,
+ children : PropTypes.node,
+ isComposing : PropTypes.bool,
+ hasComposingText : PropTypes.bool,
hasMediaAttachments: PropTypes.bool,
- canUploadMore: PropTypes.bool,
- location: PropTypes.object,
- intl: PropTypes.object.isRequired,
- dropdownMenuIsOpen: PropTypes.bool,
+ canUploadMore : PropTypes.bool,
+ location : PropTypes.object,
+ intl : PropTypes.object.isRequired,
+ dropdownMenuIsOpen : PropTypes.bool,
};
state = {
@@ -259,20 +416,20 @@ class UI extends React.PureComponent {
// but we set user-friendly message for other browsers, e.g. Edge.
e.returnValue = intl.formatMessage(messages.beforeUnload);
}
- }
+ };
handleWindowFocus = () => {
this.props.dispatch(focusApp());
- }
+ };
handleWindowBlur = () => {
this.props.dispatch(unfocusApp());
- }
+ };
handleLayoutChange = () => {
// The cached heights are no longer accurate, invalidate
this.props.dispatch(clearHeight());
- }
+ };
handleDragEnter = (e) => {
e.preventDefault();
@@ -288,7 +445,7 @@ class UI extends React.PureComponent {
if (e.dataTransfer && Array.from(e.dataTransfer.types).includes('Files') && this.props.canUploadMore) {
this.setState({ draggingOver: true });
}
- }
+ };
handleDragOver = (e) => {
if (this.dataTransferIsText(e.dataTransfer)) return false;
@@ -303,7 +460,7 @@ class UI extends React.PureComponent {
}
return false;
- }
+ };
handleDrop = (e) => {
if (this.dataTransferIsText(e.dataTransfer)) return;
@@ -316,7 +473,7 @@ class UI extends React.PureComponent {
if (e.dataTransfer && e.dataTransfer.files.length >= 1 && this.props.canUploadMore) {
this.props.dispatch(uploadCompose(e.dataTransfer.files));
}
- }
+ };
handleDragLeave = (e) => {
e.preventDefault();
@@ -329,15 +486,15 @@ class UI extends React.PureComponent {
}
this.setState({ draggingOver: false });
- }
+ };
dataTransferIsText = (dataTransfer) => {
return (dataTransfer && Array.from(dataTransfer.types).filter((type) => type === 'text/plain').length === 1);
- }
+ };
closeUploadModal = () => {
this.setState({ draggingOver: false });
- }
+ };
handleServiceWorkerPostMessage = ({ data }) => {
if (data.type === 'navigate') {
@@ -345,9 +502,9 @@ class UI extends React.PureComponent {
} else {
console.warn('Unknown message type:', data.type);
}
- }
+ };
- componentWillMount () {
+ componentWillMount() {
window.addEventListener('focus', this.handleWindowFocus, false);
window.addEventListener('blur', this.handleWindowBlur, false);
window.addEventListener('beforeunload', this.handleBeforeUnload, false);
@@ -358,7 +515,7 @@ class UI extends React.PureComponent {
document.addEventListener('dragleave', this.handleDragLeave, false);
document.addEventListener('dragend', this.handleDragEnd, false);
- if ('serviceWorker' in navigator) {
+ if ('serviceWorker' in navigator) {
navigator.serviceWorker.addEventListener('message', this.handleServiceWorkerPostMessage);
}
@@ -372,13 +529,13 @@ class UI extends React.PureComponent {
setTimeout(() => this.props.dispatch(fetchFilters()), 500);
}
- componentDidMount () {
+ componentDidMount() {
this.hotkeys.__mousetrap__.stopCallback = (e, element) => {
return ['TEXTAREA', 'SELECT', 'INPUT'].includes(element.tagName);
};
}
- componentWillUnmount () {
+ componentWillUnmount() {
window.removeEventListener('focus', this.handleWindowFocus);
window.removeEventListener('blur', this.handleWindowBlur);
window.removeEventListener('beforeunload', this.handleBeforeUnload);
@@ -392,7 +549,7 @@ class UI extends React.PureComponent {
setRef = c => {
this.node = c;
- }
+ };
handleHotkeyNew = e => {
e.preventDefault();
@@ -402,7 +559,7 @@ class UI extends React.PureComponent {
if (element) {
element.focus();
}
- }
+ };
handleHotkeySearch = e => {
e.preventDefault();
@@ -412,15 +569,15 @@ class UI extends React.PureComponent {
if (element) {
element.focus();
}
- }
+ };
handleHotkeyForceNew = e => {
this.handleHotkeyNew(e);
this.props.dispatch(resetCompose());
- }
+ };
handleHotkeyFocusColumn = e => {
- const index = (e.key * 1) + 1; // First child is drawer, skip that
+ const index = (e.key * 1) + 1; // First child is drawer, skip that
const column = this.node.querySelector(`.column:nth-child(${index})`);
if (!column) return;
const container = column.querySelector('.scrollable');
@@ -435,7 +592,7 @@ class UI extends React.PureComponent {
status.focus();
}
}
- }
+ };
handleHotkeyBack = () => {
if (window.history && window.history.length === 1) {
@@ -443,11 +600,11 @@ class UI extends React.PureComponent {
} else {
this.context.router.history.goBack();
}
- }
+ };
setHotkeysRef = c => {
this.hotkeys = c;
- }
+ };
handleHotkeyToggleHelp = () => {
if (this.props.location.pathname === '/keyboard-shortcuts') {
@@ -455,95 +612,111 @@ class UI extends React.PureComponent {
} else {
this.context.router.history.push('/keyboard-shortcuts');
}
- }
+ };
handleHotkeyGoToHome = () => {
this.context.router.history.push('/timelines/home');
- }
+ };
handleHotkeyGoToNotifications = () => {
this.context.router.history.push('/notifications');
- }
+ };
handleHotkeyGoToLocal = () => {
this.context.router.history.push('/timelines/public/local');
- }
+ };
handleHotkeyGoToFederated = () => {
this.context.router.history.push('/timelines/public');
- }
+ };
handleHotkeyGoToDirect = () => {
this.context.router.history.push('/timelines/direct');
- }
+ };
handleHotkeyGoToStart = () => {
this.context.router.history.push('/getting-started');
- }
+ };
handleHotkeyGoToFavourites = () => {
this.context.router.history.push('/favourites');
- }
+ };
handleHotkeyGoToPinned = () => {
this.context.router.history.push('/pinned');
- }
+ };
handleHotkeyGoToProfile = () => {
this.context.router.history.push(`/accounts/${me}`);
- }
+ };
handleHotkeyGoToBlocked = () => {
this.context.router.history.push('/blocks');
- }
+ };
handleHotkeyGoToMuted = () => {
this.context.router.history.push('/mutes');
- }
+ };
handleHotkeyGoToRequests = () => {
this.context.router.history.push('/follow_requests');
- }
+ };
- render () {
+ render() {
const { draggingOver } = this.state;
const { children, isComposing, location, dropdownMenuIsOpen } = this.props;
const handlers = {
- help: this.handleHotkeyToggleHelp,
- new: this.handleHotkeyNew,
- search: this.handleHotkeySearch,
- forceNew: this.handleHotkeyForceNew,
- focusColumn: this.handleHotkeyFocusColumn,
- back: this.handleHotkeyBack,
- goToHome: this.handleHotkeyGoToHome,
+ help : this.handleHotkeyToggleHelp,
+ new : this.handleHotkeyNew,
+ search : this.handleHotkeySearch,
+ forceNew : this.handleHotkeyForceNew,
+ focusColumn : this.handleHotkeyFocusColumn,
+ back : this.handleHotkeyBack,
+ goToHome : this.handleHotkeyGoToHome,
goToNotifications: this.handleHotkeyGoToNotifications,
- goToLocal: this.handleHotkeyGoToLocal,
- goToFederated: this.handleHotkeyGoToFederated,
- goToDirect: this.handleHotkeyGoToDirect,
- goToStart: this.handleHotkeyGoToStart,
- goToFavourites: this.handleHotkeyGoToFavourites,
- goToPinned: this.handleHotkeyGoToPinned,
- goToProfile: this.handleHotkeyGoToProfile,
- goToBlocked: this.handleHotkeyGoToBlocked,
- goToMuted: this.handleHotkeyGoToMuted,
- goToRequests: this.handleHotkeyGoToRequests,
+ goToLocal : this.handleHotkeyGoToLocal,
+ goToFederated : this.handleHotkeyGoToFederated,
+ goToDirect : this.handleHotkeyGoToDirect,
+ goToStart : this.handleHotkeyGoToStart,
+ goToFavourites : this.handleHotkeyGoToFavourites,
+ goToPinned : this.handleHotkeyGoToPinned,
+ goToProfile : this.handleHotkeyGoToProfile,
+ goToBlocked : this.handleHotkeyGoToBlocked,
+ goToMuted : this.handleHotkeyGoToMuted,
+ goToRequests : this.handleHotkeyGoToRequests,
};
return (
-
-
-
+
+
+
{children}
-
+
-
+
-
-
+
+
);
}
diff --git a/app/javascript/mastodon/features/ui/util/react_router_helpers.js b/app/javascript/mastodon/features/ui/util/react_router_helpers.js
index d452b871f..4de3c1f6a 100644
--- a/app/javascript/mastodon/features/ui/util/react_router_helpers.js
+++ b/app/javascript/mastodon/features/ui/util/react_router_helpers.js
@@ -1,6 +1,6 @@
import React from 'react';
import PropTypes from 'prop-types';
-import { Switch, Route } from 'react-router-dom';
+import { Route, Switch } from 'react-router-dom';
import ColumnLoading from '../components/column_loading';
import BundleColumnError from '../components/bundle_column_error';
@@ -9,13 +9,13 @@ import BundleContainer from '../containers/bundle_container';
// Small wrapper to pass multiColumn to the route components
export class WrappedSwitch extends React.PureComponent {
- render () {
+ render() {
const { multiColumn, children } = this.props;
return (
-
+
{React.Children.map(children, child => React.cloneElement(child, { multiColumn }))}
-
+
);
}
@@ -23,7 +23,7 @@ export class WrappedSwitch extends React.PureComponent {
WrappedSwitch.propTypes = {
multiColumn: PropTypes.bool,
- children: PropTypes.node,
+ children : PropTypes.node,
};
// Small Wrapper to extract the params from the route and pass
@@ -32,9 +32,9 @@ WrappedSwitch.propTypes = {
export class WrappedRoute extends React.Component {
static propTypes = {
- component: PropTypes.func.isRequired,
- content: PropTypes.node,
- multiColumn: PropTypes.bool,
+ component : PropTypes.func.isRequired,
+ content : PropTypes.node,
+ multiColumn : PropTypes.bool,
componentParams: PropTypes.object,
};
@@ -46,21 +46,28 @@ export class WrappedRoute extends React.Component {
const { component, content, multiColumn, componentParams } = this.props;
return (
-
- {Component => {content}}
-
+
+ {Component => ({content})}
+
);
- }
+ };
renderLoading = () => {
return ;
- }
+ };
renderError = (props) => {
return ;
- }
+ };
- render () {
+ render() {
const { component: Component, content, ...rest } = this.props;
return ;
diff --git a/app/javascript/mastodon/features/ui/util/reduced_motion.js b/app/javascript/mastodon/features/ui/util/reduced_motion.js
index 95519042b..af010d384 100644
--- a/app/javascript/mastodon/features/ui/util/reduced_motion.js
+++ b/app/javascript/mastodon/features/ui/util/reduced_motion.js
@@ -15,9 +15,9 @@ class ReducedMotion extends React.Component {
static propTypes = {
defaultStyle: PropTypes.object,
- style: PropTypes.object,
- children: PropTypes.func,
- }
+ style : PropTypes.object,
+ children : PropTypes.func,
+ };
render() {
@@ -33,9 +33,12 @@ class ReducedMotion extends React.Component {
});
return (
-
+
{children}
-
+
);
}
diff --git a/app/javascript/mastodon/initial_state.js b/app/javascript/mastodon/initial_state.js
index 1134c55db..e691b2f38 100644
--- a/app/javascript/mastodon/initial_state.js
+++ b/app/javascript/mastodon/initial_state.js
@@ -25,5 +25,5 @@ export const usePendingItems = getMeta('use_pending_items');
export const showTrends = getMeta('trends');
export const title = getMeta('title');
export const cropImages = getMeta('crop_images');
-
+console.log('initialState', initialState);
export default initialState;
diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json
index e4e790bdd..5cae5af50 100644
--- a/app/javascript/mastodon/locales/fr.json
+++ b/app/javascript/mastodon/locales/fr.json
@@ -5,7 +5,7 @@
"account.block_domain": "Tout masquer venant de {domain}",
"account.blocked": "Bloqué·e",
"account.cancel_follow_request": "Annuler la demande de suivi",
- "account.direct": "Envoyer un message direct à @{name}",
+ "account.direct": "Envoyer un message privé à @{name}",
"account.domain_blocked": "Domaine caché",
"account.edit_profile": "Modifier le profil",
"account.endorse": "Recommander sur le profil",
@@ -52,6 +52,7 @@
"bundle_modal_error.retry": "Réessayer",
"column.bookmarks": "Marque pages",
"column.blocks": "Comptes bloqués",
+ "column.bookmarks": "Bookmarks",
"column.community": "Fil public local",
"column.direct": "Messages privés",
"column.directory": "Parcourir les profils",
@@ -139,8 +140,9 @@
"empty_column.account_timeline": "Aucun pouet ici !",
"empty_column.account_unavailable": "Profil non disponible",
"empty_column.blocks": "Vous n’avez bloqué aucun·e utilisateur·rice pour le moment.",
+ "empty_column.bookmarked_statuses": "You don't have any bookmarked toots yet. When you bookmark one, it will show up here.",
"empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !",
- "empty_column.direct": "Vous n’avez pas encore de messages directs. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.",
+ "empty_column.direct": "Vous n’avez pas encore de messages privés. Lorsque vous en enverrez ou recevrez un, il s’affichera ici.",
"empty_column.domain_blocks": "Il n’y a aucun domaine caché pour le moment.",
"empty_column.favourited_statuses": "Vous n’avez aucun pouet favoris pour le moment. Lorsque vous en mettrez un en favori, il apparaîtra ici.",
"empty_column.favourites": "Personne n’a encore mis ce pouet en favori. Lorsque quelqu’un le fera, il apparaîtra ici.",
@@ -164,7 +166,7 @@
"getting_started.documentation": "Documentation",
"getting_started.heading": "Pour commencer",
"getting_started.invite": "Inviter des gens",
- "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer ou faire des rapports de bogues via {github} sur GitHub.",
+ "getting_started.open_source_notice": "Mastodon est un logiciel libre. Vous pouvez contribuer ou faire des rapports de bogues via {forge} sur GitHub.",
"getting_started.security": "Sécurité",
"getting_started.terms": "Conditions d’utilisation",
"hashtag.column_header.tag_mode.all": "et {additional}",
@@ -205,7 +207,7 @@
"keyboard_shortcuts.column": "pour focaliser un statut dans l’une des colonnes",
"keyboard_shortcuts.compose": "pour focaliser la zone de rédaction",
"keyboard_shortcuts.description": "Description",
- "keyboard_shortcuts.direct": "pour ouvrir la colonne des messages directs",
+ "keyboard_shortcuts.direct": "pour ouvrir la colonne des messages privés",
"keyboard_shortcuts.down": "pour descendre dans la liste",
"keyboard_shortcuts.enter": "pour ouvrir le statut",
"keyboard_shortcuts.favourite": "pour ajouter aux favoris",
@@ -253,9 +255,10 @@
"mute_modal.hide_notifications": "Masquer les notifications de cette personne ?",
"navigation_bar.apps": "Applications mobiles",
"navigation_bar.blocks": "Comptes bloqués",
+ "navigation_bar.bookmarks": "Bookmarks",
"navigation_bar.community_timeline": "Fil public local",
"navigation_bar.compose": "Rédiger un nouveau pouet",
- "navigation_bar.direct": "Messages directs",
+ "navigation_bar.direct": "Messages privés",
"navigation_bar.discover": "Découvrir",
"navigation_bar.domain_blocks": "Domaines cachés",
"navigation_bar.edit_profile": "Modifier le profil",
@@ -352,7 +355,7 @@
"status.copy": "Copier le lien vers le pouet",
"status.delete": "Effacer",
"status.detailed_status": "Vue détaillée de la conversation",
- "status.direct": "Envoyer un message direct à @{name}",
+ "status.direct": "Envoyer un message privé à @{name}",
"status.embed": "Intégrer",
"status.favourite": "Ajouter aux favoris",
"status.filtered": "Filtré",
@@ -371,6 +374,7 @@
"status.reblogged_by": "{name} a partagé :",
"status.reblogs.empty": "Personne n’a encore partagé ce pouet. Lorsque quelqu’un le fera, il apparaîtra ici.",
"status.redraft": "Effacer et ré-écrire",
+ "status.remove_bookmark": "Enlever le marque-page",
"status.reply": "Répondre",
"status.replyAll": "Répondre au fil",
"status.report": "Signaler @{name}",
@@ -386,9 +390,9 @@
"status.unpin": "Retirer du profil",
"suggestions.dismiss": "Rejeter la suggestion",
"suggestions.header": "Vous pourriez être intéressé·e par…",
- "tabs_bar.federated_timeline": "Fil public global",
+ "tabs_bar.federated_timeline": "Global",
"tabs_bar.home": "Accueil",
- "tabs_bar.local_timeline": "Fil public local",
+ "tabs_bar.local_timeline": "Local",
"tabs_bar.notifications": "Notifications",
"tabs_bar.search": "Chercher",
"time_remaining.days": "{number, plural, one {# day} other {# days}} restants",
diff --git a/app/javascript/mastodon/reducers/accounts.js b/app/javascript/mastodon/reducers/accounts.js
index 530ed8e60..22499c964 100644
--- a/app/javascript/mastodon/reducers/accounts.js
+++ b/app/javascript/mastodon/reducers/accounts.js
@@ -1,5 +1,5 @@
import { ACCOUNT_IMPORT, ACCOUNTS_IMPORT } from '../actions/importer';
-import { Map as ImmutableMap, fromJS } from 'immutable';
+import { fromJS, Map as ImmutableMap } from 'immutable';
const initialState = ImmutableMap();
@@ -22,7 +22,7 @@ const normalizeAccounts = (state, accounts) => {
};
export default function accounts(state = initialState, action) {
- switch(action.type) {
+ switch (action.type) {
case ACCOUNT_IMPORT:
return normalizeAccount(state, action.account);
case ACCOUNTS_IMPORT:
diff --git a/app/javascript/mastodon/reducers/statuses.js b/app/javascript/mastodon/reducers/statuses.js
index 772f98bcb..7805d2882 100644
--- a/app/javascript/mastodon/reducers/statuses.js
+++ b/app/javascript/mastodon/reducers/statuses.js
@@ -1,21 +1,16 @@
import {
- REBLOG_REQUEST,
- REBLOG_FAIL,
- FAVOURITE_REQUEST,
- FAVOURITE_FAIL,
- UNFAVOURITE_SUCCESS,
- BOOKMARK_REQUEST,
BOOKMARK_FAIL,
+ BOOKMARK_REQUEST,
+ FAVOURITE_FAIL,
+ FAVOURITE_REQUEST,
+ REBLOG_FAIL,
+ REBLOG_REQUEST,
+ UNFAVOURITE_SUCCESS,
} from '../actions/interactions';
-import {
- STATUS_MUTE_SUCCESS,
- STATUS_UNMUTE_SUCCESS,
- STATUS_REVEAL,
- STATUS_HIDE,
-} from '../actions/statuses';
+import { STATUS_HIDE, STATUS_MUTE_SUCCESS, STATUS_REVEAL, STATUS_UNMUTE_SUCCESS } from '../actions/statuses';
import { TIMELINE_DELETE } from '../actions/timelines';
import { STATUS_IMPORT, STATUSES_IMPORT } from '../actions/importer';
-import { Map as ImmutableMap, fromJS } from 'immutable';
+import { fromJS, Map as ImmutableMap } from 'immutable';
const importStatus = (state, status) => state.set(status.id, fromJS(status));
@@ -33,7 +28,7 @@ const deleteStatus = (state, id, references) => {
const initialState = ImmutableMap();
export default function statuses(state = initialState, action) {
- switch(action.type) {
+ switch (action.type) {
case STATUS_IMPORT:
return importStatus(state, action.status);
case STATUSES_IMPORT:
diff --git a/app/javascript/mastodon/utils/snowstorm-min.js b/app/javascript/mastodon/utils/snowstorm-min.js
new file mode 100644
index 000000000..733b45f06
--- /dev/null
+++ b/app/javascript/mastodon/utils/snowstorm-min.js
@@ -0,0 +1,29 @@
+/** @license
+
+ DHTML Snowstorm! JavaScript-based snow for web pages
+ Making it snow on the internets since 2003. You're welcome.
+ -----------------------------------------------------------
+ Version 1.44.20131208 (Previous rev: 1.44.20131125)
+ Copyright (c) 2007, Scott Schiller. All rights reserved.
+ Code provided under the BSD License
+ http://schillmania.com/projects/snowstorm/license.txt
+*/
+var snowStorm=function(g,f){function k(a,d){isNaN(d)&&(d=0);return Math.random()*a+d}function x(){g.setTimeout(function(){a.start(!0)},20);a.events.remove(m?f:g,"mousemove",x)}function y(){(!a.excludeMobile||!D)&&x();a.events.remove(g,"load",y)}this.excludeMobile=this.autoStart=!0;this.flakesMax=128;this.flakesMaxActive=64;this.animationInterval=33;this.useGPU=!0;this.className=null;this.excludeMobile=!0;this.flakeBottom=null;this.followMouse=!0;this.snowColor="#fff";this.snowCharacter="•";this.snowStick=
+!0;this.targetElement=null;this.useMeltEffect=!0;this.usePixelPosition=this.usePositionFixed=this.useTwinkleEffect=!1;this.freezeOnBlur=!0;this.flakeRightOffset=this.flakeLeftOffset=0;this.flakeHeight=this.flakeWidth=8;this.vMaxX=5;this.vMaxY=4;this.zIndex=0;var a=this,q,m=navigator.userAgent.match(/msie/i),E=navigator.userAgent.match(/msie 6/i),D=navigator.userAgent.match(/mobile|opera m(ob|in)/i),r=m&&"BackCompat"===f.compatMode||E,h=null,n=null,l=null,p=null,s=null,z=null,A=null,v=1,t=!1,w=!1,
+u;a:{try{f.createElement("div").style.opacity="0.5"}catch(F){u=!1;break a}u=!0}var B=!1,C=f.createDocumentFragment();q=function(){function c(b){g.setTimeout(b,1E3/(a.animationInterval||20))}function d(a){return void 0!==h.style[a]?a:null}var e,b=g.requestAnimationFrame||g.webkitRequestAnimationFrame||g.mozRequestAnimationFrame||g.oRequestAnimationFrame||g.msRequestAnimationFrame||c;e=b?function(){return b.apply(g,arguments)}:null;var h;h=f.createElement("div");e={transform:{ie:d("-ms-transform"),
+moz:d("MozTransform"),opera:d("OTransform"),webkit:d("webkitTransform"),w3:d("transform"),prop:null},getAnimationFrame:e};e.transform.prop=e.transform.w3||e.transform.moz||e.transform.webkit||e.transform.ie||e.transform.opera;h=null;return e}();this.timer=null;this.flakes=[];this.active=this.disabled=!1;this.meltFrameCount=20;this.meltFrames=[];this.setXY=function(c,d,e){if(!c)return!1;a.usePixelPosition||w?(c.style.left=d-a.flakeWidth+"px",c.style.top=e-a.flakeHeight+"px"):r?(c.style.right=100-100*
+(d/h)+"%",c.style.top=Math.min(e,s-a.flakeHeight)+"px"):a.flakeBottom?(c.style.right=100-100*(d/h)+"%",c.style.top=Math.min(e,s-a.flakeHeight)+"px"):(c.style.right=100-100*(d/h)+"%",c.style.bottom=100-100*(e/l)+"%")};this.events=function(){function a(c){c=b.call(c);var d=c.length;e?(c[1]="on"+c[1],3b.vX?b.vX=0.2:0>b.vX&&-0.2b.vY&&(b.vY=0.2)};this.move=function(){var c=b.vX*v;b.x+=c;b.y+=b.vY*b.vAmp;b.x>=h||h-b.xc&&b.x-a.flakeLeftOffset<-a.flakeWidth&&(b.x=h-a.flakeWidth-1);b.refresh();l+p-b.y+a.flakeHeight
+b.type&&!b.melting&&0.998b.twinkleFrame?0.97a.flakesMaxActive)a.flakes[a.flakes.length-1].active=-1;a.targetElement.appendChild(C)};this.timerInit=function(){a.timer=
+!0;a.snow()};this.init=function(){var c;for(c=0;c {
delegate(document, '#domain_block_severity', 'change', ({ target }) => onDomainBlockSeverityChange(target));
+const onEnableBootstrapTimelineAccountsChange = (target) => {
+ const bootstrapTimelineAccountsField = document.querySelector('#form_admin_settings_bootstrap_timeline_accounts');
+
+ if (bootstrapTimelineAccountsField) {
+ bootstrapTimelineAccountsField.disabled = !target.checked;
+ if (target.checked) {
+ bootstrapTimelineAccountsField.parentElement.classList.remove('disabled');
+ } else {
+ bootstrapTimelineAccountsField.parentElement.classList.add('disabled');
+ }
+ }
+};
+
+delegate(document, '#form_admin_settings_enable_bootstrap_timeline_accounts', 'change', ({ target }) => onEnableBootstrapTimelineAccountsChange(target));
+
ready(() => {
- const input = document.getElementById('domain_block_severity');
- if (input) onDomainBlockSeverityChange(input);
+ const domainBlockSeverityInput = document.getElementById('domain_block_severity');
+ if (domainBlockSeverityInput) onDomainBlockSeverityChange(domainBlockSeverityInput);
+
+ const enableBootstrapTimelineAccounts = document.getElementById('form_admin_settings_enable_bootstrap_timeline_accounts');
+ if (enableBootstrapTimelineAccounts) onEnableBootstrapTimelineAccountsChange(enableBootstrapTimelineAccounts);
});
diff --git a/app/javascript/styles/bliss.scss b/app/javascript/styles/bliss.scss
index 2e45ff0c7..898c465fd 100644
--- a/app/javascript/styles/bliss.scss
+++ b/app/javascript/styles/bliss.scss
@@ -1,3 +1,6 @@
+@import '~bulma/sass/utilities/_all';
+@import '~bulma/sass/grid/columns';
+
@import 'bliss/variables';
@import 'bliss/mixins';
@import 'bliss/variables';
diff --git a/app/javascript/styles/bliss/_mixins.scss b/app/javascript/styles/bliss/_mixins.scss
index faaffb30f..b08255cff 100644
--- a/app/javascript/styles/bliss/_mixins.scss
+++ b/app/javascript/styles/bliss/_mixins.scss
@@ -72,3 +72,13 @@
color: $inverted-text-color;
}
}
+
+.hidden {
+ display: none;
+
+ &:before {
+ content: "hidden div here";
+ background: yellow;
+ padding: 1em;
+ }
+}
diff --git a/app/javascript/styles/bliss/about.scss b/app/javascript/styles/bliss/about.scss
index 61637ce96..c9c9174ce 100644
--- a/app/javascript/styles/bliss/about.scss
+++ b/app/javascript/styles/bliss/about.scss
@@ -1,7 +1,3 @@
-$maximum-width: 1235px;
-$fluid-breakpoint: $maximum-width + 20px;
-$column-breakpoint: 700px;
-$small-breakpoint: 960px;
.container {
box-sizing: border-box;
@@ -622,7 +618,7 @@ $small-breakpoint: 960px;
}
}
- @media screen and (max-width: 675px) {
+ @media screen and (max-width: $xs-breakpoint) {
.header-wrapper {
padding-top: 0;
@@ -649,7 +645,7 @@ $small-breakpoint: 960px;
.landing {
margin-bottom: 100px;
- @media screen and (max-width: 738px) {
+ @media screen and (max-width: $xs-top-breakpoint) {
margin-bottom: 0;
}
@@ -715,9 +711,9 @@ $small-breakpoint: 960px;
}
.account__avatar {
- width: 44px;
- height: 44px;
- background-size: 44px 44px;
+ width: $avatar-side;
+ height: $avatar-side;
+ background-size: $avatar-side $avatar-side;
}
}
@@ -752,13 +748,13 @@ $small-breakpoint: 960px;
}
&__grid {
- max-width: 960px;
+ max-width: $small-breakpoint;
margin: 0 auto;
display: grid;
grid-template-columns: minmax(0, 50%) minmax(0, 50%);
grid-gap: 30px;
- @media screen and (max-width: 738px) {
+ @media screen and (max-width: $xs-top-breakpoint) {
grid-template-columns: minmax(0, 100%);
grid-gap: 10px;
diff --git a/app/javascript/styles/bliss/accessibility.scss b/app/javascript/styles/bliss/accessibility.scss
index ebe8a1f36..76b07987a 100644
--- a/app/javascript/styles/bliss/accessibility.scss
+++ b/app/javascript/styles/bliss/accessibility.scss
@@ -13,6 +13,4 @@ $black-emojis: '8ball' 'ant' 'back' 'black_circle' 'black_heart' 'black_large_sq
}
}
-.fa {
- margin-right: 1ch;
-}
+
diff --git a/app/javascript/styles/bliss/admin.scss b/app/javascript/styles/bliss/admin.scss
index f625bc139..9e36f6789 100644
--- a/app/javascript/styles/bliss/admin.scss
+++ b/app/javascript/styles/bliss/admin.scss
@@ -384,6 +384,22 @@ hr.spacer {
max-width: 100%;
}
+input {
+ background: auto;
+}
+
+hr,
+.select select,
+.textarea,
+.input {
+ background-color: transparent;
+ border-color: transparent;
+
+ &:hover {
+ border: transparent;
+ }
+}
+
.batch-form-box {
display: flex;
flex-wrap: wrap;
diff --git a/app/javascript/styles/bliss/basics.scss b/app/javascript/styles/bliss/basics.scss
index f9332caa3..42cdae7aa 100644
--- a/app/javascript/styles/bliss/basics.scss
+++ b/app/javascript/styles/bliss/basics.scss
@@ -160,3 +160,35 @@ button {
height: 100%;
}
}
+
+
+.media-gallery {
+ margin-left: 0;
+}
+
+.debug, .well {
+ padding: 0.5rem;
+ border: solid 1px greenyellow;
+ background: yellow;
+ color: #222;
+
+}
+
+.spacer {
+ display: block;
+ padding: 1em;
+}
+
+.small-texts {
+ .timelines {
+ .column-link {
+
+
+ }
+
+ span {
+ display: none;
+ }
+ }
+}
+
diff --git a/app/javascript/styles/bliss/components.scss b/app/javascript/styles/bliss/components.scss
index f2a118e06..c2d694d14 100644
--- a/app/javascript/styles/bliss/components.scss
+++ b/app/javascript/styles/bliss/components.scss
@@ -406,6 +406,10 @@
}
}
+ .autosuggest-textarea__textarea {
+ margin-bottom: 5px;
+ }
+
.autosuggest-textarea__textarea,
.spoiler-input__input {
display: block;
@@ -2193,27 +2197,16 @@ a.account__display-name {
}
.notification {
- &__message {
- margin-left: 48px + 15px * 2;
- padding-top: 15px;
- }
-
- &__favourite-icon-wrapper {
- left: -32px;
- }
-
- .status {
- padding-top: 8px;
- }
+ background-color: $classic-base-color !important;
+ padding: 1em 0;
+ color: $ui-highlight-color;
+ border-left: $ui-highlight-color 5px solid;
.account {
+ padding: 0;
padding-top: 8px;
}
- .account__avatar-wrapper {
- margin-left: 17px;
- margin-right: 15px;
- }
}
}
}
@@ -2261,6 +2254,7 @@ a.account__display-name {
.columns-area__panels__pane--compositional {
display: none;
}
+
}
@media screen and (min-width: 600px + (285px * 1) + (10px * 1)) {
@@ -2315,6 +2309,7 @@ a.account__display-name {
flex-direction: column;
height: calc(100% - 10px);
overflow-y: hidden;
+ z-index: 1;
.navigation-bar {
padding-top: 20px;
@@ -2659,6 +2654,28 @@ a.account__display-name {
padding: 15px;
text-decoration: none;
+ .timelines & {
+ display: inline-block;
+ width: 20%;
+ display: inline-block !important;
+ float: left;
+ text-align: center;
+
+ span {
+ opacity: 0;
+ transition: opacity ease-in 1s;
+
+
+ }
+
+ &:hover {
+ span {
+ opacity: 1;
+ transition: opacity ease-in 0.2s;
+ }
+ }
+ }
+
&:hover,
&:focus,
&:active {
diff --git a/app/javascript/styles/bliss/footer.scss b/app/javascript/styles/bliss/footer.scss
index 55786d424..79992015d 100644
--- a/app/javascript/styles/bliss/footer.scss
+++ b/app/javascript/styles/bliss/footer.scss
@@ -136,7 +136,23 @@
}
}
-.getting-started__footer {
+.links-started__footer {
+ display: block;
+ position: fixed;
+ bottom: 0;
+ left: 1em;
+ width: 300px;
+ z-index: 10;
+ text-align: right;
+ color: $ui-primary-color;
+
+ hr {
+ border-color: $ui-primary-color;
+ }
+
+ .fa {
+ margin-right: 1ch;
+ }
ul {
list-style-type: none;
@@ -150,4 +166,36 @@
i {
margin: 0.5ch;
}
+
+ a {
+ margin-left: 2ch;
+ color: $ui-primary-color;
+ padding: 3px;
+ border-radius: 3px;
+
+ &:hover {
+ color: white;
+ background: $ui-highlight-color;
+ }
+ }
+
+ @media all and(min-width: $maximum-width) {
+ & {
+ width: 25vw;
+ }
+ }
+ @media all and(max-width: $maximum-width) {
+ & {
+ width: 22vw;
+ height: 50vh;
+ overflow-y: auto;
+ padding-right: 1em;
+ }
+ }
+ @media all and(max-width: $small-breakpoint) {
+ & {
+ display: none;
+ }
+ }
}
+
diff --git a/app/javascript/styles/bliss/forms.scss b/app/javascript/styles/bliss/forms.scss
index 4b32b4058..9dad89515 100644
--- a/app/javascript/styles/bliss/forms.scss
+++ b/app/javascript/styles/bliss/forms.scss
@@ -1,35 +1,41 @@
$no-columns-breakpoint: 600px;
-table{
- thead{
+table {
+ thead {
- th{
+ th {
font-weight: 800;
background: $ui-highlight-color;
}
}
- td, th{
- padding: 1rem;
- }
- a{
+
+ td, th {
+ padding: 1rem;
+ }
+
+ a {
@extend .text-btn
}
}
-.table-responsive{
+
+.table-responsive {
width: 100%;
}
-.table-striped{
+
+.table-striped {
margin: 1rem 0;
- tr{
+ tr {
- &:odd{
+ &:odd {
background: $ui-base-lighter-color;
}
}
}
-.group-form{
+
+.group-form {
}
+
code {
font-family: $font-monospace, monospace;
font-weight: 400;
@@ -114,6 +120,7 @@ code {
position: absolute;
margin: 0 4px;
margin-top: -2px;
+ background: $ui-highlight-color;
}
}
}
@@ -957,3 +964,8 @@ code {
flex-direction: row;
}
}
+
+.compose-form__publish-button-wrapper {
+ width: 100%;
+ display: block;
+}
diff --git a/app/javascript/styles/bliss/messaging.scss b/app/javascript/styles/bliss/messaging.scss
index 95cac0639..2331eb447 100644
--- a/app/javascript/styles/bliss/messaging.scss
+++ b/app/javascript/styles/bliss/messaging.scss
@@ -1,84 +1 @@
-$messagingBoxWidth: 15em;
-$messagingBoxHeight: 20em;
-
-.fixed-box {
- border: solid 1px white;
- padding: 1em;
- position: fixed;
- bottom: 0;
-}
-
-.messaging-box {
- @extend .fixed-box;
-
- right: 1em;
- width: $messagingBoxWidth;
- background: $ui-base-color;
-}
-
-.conversations_list {
- @extend .fixed-box;
- width: $messagingBoxWidth;
- right: $messagingBoxWidth + 5em;
- background: $ui-secondary-color;
-}
-
-.conversation-item {
- &.has-new-message {
- background: $ui-highlight-color;
- color: $classic-primary-color;
- }
-}
-
-.conversation_created-at {
- margin-right: 1em;
-}
-
-.conversation_stream {
- padding-top: 1em;
- height: $messagingBoxHeight;
- overflow: auto;
- background: $ui-secondary-color;
-
- .message {
- -webkit-border-radius: 0.5rem;
- -moz-border-radius: 0.5rem;
- border-radius: 0.5rem;
- margin-bottom: 0.5em;
- padding: 0.5em 1em;
- width: 80%;
- }
-
- .mine {
- text-align: right;
- background: $classic-primary-color;
- float: right;
-
- .arrow-down {
- border-top-color: $classic-primary-color;
- left: 1em;
- }
- }
-
- .theirs {
- text-align: left;
- background: $ui-highlight-color;
- float: left;
-
- .arrow-down {
- border-top-color: $ui-highlight-color;
- right: 1em;
- }
- }
-
- .arrow-down {
- width: 0;
- height: 0;
- border-left: 10px solid transparent;
- border-right: 20px solid transparent;
- border-top: 20px solid $classic-primary-color;
- position: relative;
- bottom: -1em;
-
- }
-}
+@import "../mastodon/messaging/main";
diff --git a/app/javascript/styles/bliss/variables.scss b/app/javascript/styles/bliss/variables.scss
index a82c44229..058ba2464 100644
--- a/app/javascript/styles/bliss/variables.scss
+++ b/app/javascript/styles/bliss/variables.scss
@@ -1,16 +1,16 @@
// Commonly used web colors
-$black: #000000; // Black
-$white: #ffffff; // White
-$success-green: #79bd9a !default; // Padua
-$error-red: #df405a !default; // Cerise
-$warning-red: #ff5050 !default; // Sunset Orange
-$gold-star: #ca8f04 !default; // Dark Goldenrod
+$black: #111; // Black
+$white: #fff; // White
+$success-green: #6bbd77 !default; // Padua
+$error-red: #d4839b !default; // Cerise
+$warning-red: #528dc8 !default; // Sunset Orange
+$gold-star: #98c6ff !default; // Dark Goldenrod
// Values from the classic Mastodon UI
-$classic-base-color: #282c37; // Midnight Express
-$classic-primary-color: #9baec8; // Echo Blue
-$classic-secondary-color: #d9e1e8; // Pattens Blue
-$classic-highlight-color: #2b90d9; // Summer Sky
+$classic-base-color: #282c37; // Midnight Express
+$classic-primary-color: #9baec8; // Echo Blue
+$classic-secondary-color: #d9e1e8; // Pattens Blue
+$classic-highlight-color: #2b90d9; // Summer Sky
// Variables for defaults in UI
$base-shadow-color: $black !default;
@@ -21,10 +21,10 @@ $valid-value-color: $success-green !default;
$error-value-color: $error-red !default;
// Tell UI to use selected colors
-$ui-base-color: $classic-base-color !default; // Darkest
+$ui-base-color: $classic-base-color !default; // Darkest
$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
-$ui-primary-color: $classic-primary-color !default; // Lighter
-$ui-secondary-color: $classic-secondary-color !default; // Lightest
+$ui-primary-color: $classic-primary-color !default; // Lighter
+$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-highlight-color: $classic-highlight-color !default;
// Variables for texts
@@ -48,7 +48,15 @@ $media-modal-media-max-width: 100%;
$media-modal-media-max-height: 80%;
$no-gap-breakpoint: 415px;
+$maximum-width: 1235px;
+$fluid-breakpoint: $maximum-width + 20px;
+$column-breakpoint: 700px;
+$small-breakpoint: 960px;
+$xs-top-breakpoint: 738px;
+$xs-breakpoint: 675px;
+// pictures
+$avatar-side: 55px;
$font-sans-serif: 'mastodon-font-sans-serif' !default;
$font-display: 'mastodon-font-display' !default;
$font-monospace: 'mastodon-font-monospace' !default;
diff --git a/app/javascript/styles/bliss/widgets.scss b/app/javascript/styles/bliss/widgets.scss
index 8c30bc57c..c9f7d750d 100644
--- a/app/javascript/styles/bliss/widgets.scss
+++ b/app/javascript/styles/bliss/widgets.scss
@@ -95,9 +95,9 @@
}
.account__avatar {
- width: 44px;
- height: 44px;
- background-size: 44px 44px;
+ width: $avatar-side;
+ height: $avatar-side;
+ background-size: $avatar-side $avatar-side;
}
}
}
@@ -537,3 +537,32 @@ $fluid-breakpoint: $maximum-width + 20px;
}
}
}
+
+// christmas snow
+.round-button {
+ cursor: pointer;
+ margin: 0.5em;
+ width: 2em;
+ height: 2em;
+ display: inline-block;
+}
+
+.snow-button {
+ -webkit-border-radius: 100%;
+ -moz-border-radius: 100%;
+ border-radius: 100%;
+ background: $ui-secondary-color;
+ @extend .round-button;
+
+ .icon {
+ margin: 0.5em;
+ }
+
+ &:hover {
+ background: $ui-primary-color;
+ }
+
+ &.active {
+ background: $ui-highlight-color;
+ }
+}
diff --git a/app/javascript/styles/contrast/variables.scss b/app/javascript/styles/contrast/variables.scss
index cfe3b21db..d8e09d46d 100644
--- a/app/javascript/styles/contrast/variables.scss
+++ b/app/javascript/styles/contrast/variables.scss
@@ -22,3 +22,4 @@ $action-button-color: #8d9ac2;
$inverted-text-color: $black !default;
$lighter-text-color: darken($ui-base-color, 6%) !default;
$light-text-color: darken($ui-primary-color, 40%) !default;
+$avatar-side: 55px;
diff --git a/app/javascript/styles/custom.scss b/app/javascript/styles/custom.scss
index c59d880a0..12aef049a 100644
--- a/app/javascript/styles/custom.scss
+++ b/app/javascript/styles/custom.scss
@@ -1,30 +1,26 @@
-@import 'large_center';
-// custom sheet made on https://www.cipherbliss.com
-// Commonly used web colors
-$black: #fff; // Black
-$white: #000; // White
-$success-green: #6bbd77 !default; // Padua
-$error-red: #d4839b !default; // Cerise
-$warning-red: #528dc8 !default; // Sunset Orange
-$gold-star: #00ec84 !default; // Dark Goldenrod
-
-// User Interface Colors
-$ui-base-color: #313644; // Midnight Express
-$ui-base-lighter-color: #bdd2d6;
-$ui-primary-color: #a1ccff; // Echo Blue
-$ui-secondary-color: #7fc0ff; // Pattens Blue
-$ui-highlight-color: #00a7d1; // Summer Sky
-
-// Variables for components
-$media-modal-media-max-width: 100%;
-// put margins on top and bottom of image to avoid the screen covered by image.
-$media-modal-media-max-height: 80%;
-// fix
-
-.media-gallery {
- margin-left: 0;
-}
-
-// then we import the rest of the world
-@import 'application';
-@import 'bliss/messaging';
+//@import 'large_center';
+//// custom sheet made on https://www.cipherbliss.com
+//// Commonly used web colors
+//$black: #fff; // Black
+//$white: #000; // White
+//$success-green: #6bbd77 !default; // Padua
+//$error-red: #d4839b !default; // Cerise
+//$warning-red: #528dc8 !default; // Sunset Orange
+//$gold-star: #00ec84 !default; // Dark Goldenrod
+//
+//// User Interface Colors
+//$ui-base-color: #313644; // Midnight Express
+//$ui-base-lighter-color: #bdd2d6;
+//$ui-primary-color: #a1ccff; // Echo Blue
+//$ui-secondary-color: #7fc0ff; // Pattens Blue
+//$ui-highlight-color: #00a7d1; // Summer Sky
+//$avatar-side: 55px;
+//// Variables for components
+//$media-modal-media-max-width: 100%;
+//// put margins on top and bottom of image to avoid the screen covered by image.
+//$media-modal-media-max-height: 80%;
+//// fix
+//
+//// then we import the rest of the world
+//@import 'application';
+//@import 'bliss/messaging';
diff --git a/app/javascript/styles/mastodon/about.scss b/app/javascript/styles/mastodon/about.scss
index cf16b54ac..404ee1518 100644
--- a/app/javascript/styles/mastodon/about.scss
+++ b/app/javascript/styles/mastodon/about.scss
@@ -751,9 +751,9 @@ $small-breakpoint: 960px;
}
.account__avatar {
- width: 44px;
- height: 44px;
- background-size: 44px 44px;
+ width: $avatar-side;
+ height: $avatar-side;
+ background-size: $avatar-side $avatar-side;
}
}
diff --git a/app/javascript/styles/mastodon/admin.scss b/app/javascript/styles/mastodon/admin.scss
index dde1d69ba..203365f5e 100644
--- a/app/javascript/styles/mastodon/admin.scss
+++ b/app/javascript/styles/mastodon/admin.scss
@@ -181,18 +181,39 @@ $content-width: 840px;
padding-top: 30px;
}
+ &-heading {
+ display: flex;
+
+ padding-bottom: 40px;
+ border-bottom: 1px solid lighten($ui-base-color, 8%);
+ margin-bottom: 40px;
+
+ flex-wrap: wrap;
+ align-items: center;
+
+ justify-content: space-between;
+
+ &-actions {
+ display: inline-flex;
+
+ & > * {
+ margin-left: 5px;
+ }
+ }
+
+ @media screen and (max-width: $no-columns-breakpoint) {
+ border-bottom: 0;
+ padding-bottom: 0;
+ }
+ }
+
h2 {
color: $secondary-text-color;
font-size: 24px;
line-height: 28px;
font-weight: 400;
- padding-bottom: 40px;
- border-bottom: 1px solid lighten($ui-base-color, 8%);
- margin-bottom: 40px;
@media screen and (max-width: $no-columns-breakpoint) {
- border-bottom: 0;
- padding-bottom: 0;
font-weight: 700;
}
}
diff --git a/app/javascript/styles/mastodon/basics.scss b/app/javascript/styles/mastodon/basics.scss
index 2b10b5ad3..e6dd02d29 100644
--- a/app/javascript/styles/mastodon/basics.scss
+++ b/app/javascript/styles/mastodon/basics.scss
@@ -229,3 +229,7 @@ button {
}
}
}
+
+.padded {
+ padding: 1em;
+}
diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss
index 13f9dfae7..35f95721f 100644
--- a/app/javascript/styles/mastodon/components.scss
+++ b/app/javascript/styles/mastodon/components.scss
@@ -949,8 +949,12 @@
}
@keyframes fade {
- 0% { opacity: 0; }
- 100% { opacity: 1; }
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
}
opacity: 1;
@@ -2175,7 +2179,7 @@ a.account__display-name {
.scrollable {
overflow: visible;
- @supports(display: grid) {
+ @supports (display: grid) {
contain: content;
}
}
@@ -2333,6 +2337,9 @@ a.account__display-name {
.columns-area__panels__pane--navigational {
display: none;
}
+ .getting-started__footer {
+ width: 250px;
+ }
}
@media screen and (min-width: 600px + (285px * 2) + (10px * 2)) {
@@ -2512,13 +2519,12 @@ a.account__display-name {
overflow-x: hidden;
flex: 1 1 auto;
-webkit-overflow-scrolling: touch;
- will-change: transform; // improves perf in mobile Chrome
&.optionally-scrollable {
overflow-y: auto;
}
- @supports(display: grid) { // hack to fix Chrome <57
+ @supports (display: grid) { // hack to fix Chrome <57
contain: strict;
}
@@ -2535,7 +2541,7 @@ a.account__display-name {
}
.scrollable.fullscreen {
- @supports(display: grid) { // hack to fix Chrome <57
+ @supports (display: grid) { // hack to fix Chrome <57
contain: none;
}
}
@@ -3465,9 +3471,15 @@ a.status-card.compact:hover {
}
@keyframes loader-label {
- 0% { opacity: 0.25; }
- 30% { opacity: 1; }
- 100% { opacity: 0.25; }
+ 0% {
+ opacity: 0.25;
+ }
+ 30% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0.25;
+ }
}
.video-error-cover {
@@ -3756,7 +3768,7 @@ a.status-card.compact:hover {
align-items: center;
justify-content: center;
- @supports(display: grid) { // hack to fix Chrome <57
+ @supports (display: grid) { // hack to fix Chrome <57
contain: strict;
}
@@ -5161,6 +5173,7 @@ a.status-card.compact:hover {
overflow: hidden;
position: absolute;
}
+
/* End Media Gallery */
.detailed,
@@ -5832,9 +5845,15 @@ noscript {
}
@keyframes flicker {
- 0% { opacity: 1; }
- 30% { opacity: 0.75; }
- 100% { opacity: 1; }
+ 0% {
+ opacity: 1;
+ }
+ 30% {
+ opacity: 0.75;
+ }
+ 100% {
+ opacity: 1;
+ }
}
@media screen and (max-width: 630px) and (max-height: 400px) {
@@ -5867,13 +5886,13 @@ noscript {
& > .icon-button.close {
will-change: opacity transform;
transition: opacity $duration * 0.5 $delay,
- transform $duration $delay;
+ transform $duration $delay;
}
& > .compose__action-bar .icon-button {
will-change: opacity transform;
transition: opacity $duration * 0.5 $delay + $duration * 0.5,
- transform $duration $delay;
+ transform $duration $delay;
}
}
}
diff --git a/app/javascript/styles/mastodon/containers.scss b/app/javascript/styles/mastodon/containers.scss
index 51d9b46b0..10a748dfa 100644
--- a/app/javascript/styles/mastodon/containers.scss
+++ b/app/javascript/styles/mastodon/containers.scss
@@ -21,7 +21,7 @@
justify-content: center;
align-items: center;
- svg {
+ > svg {
fill: $primary-text-color;
height: 42px;
margin-right: 10px;
diff --git a/app/javascript/styles/mastodon/messaging/config.scss b/app/javascript/styles/mastodon/messaging/config.scss
new file mode 100644
index 000000000..c98db0115
--- /dev/null
+++ b/app/javascript/styles/mastodon/messaging/config.scss
@@ -0,0 +1,3 @@
+$messagingBoxWidth: 20em;
+$messagingBoxHeight: 100%;
+$conversationBoxHeight: 20em;
diff --git a/app/javascript/styles/mastodon/messaging/contacts.scss b/app/javascript/styles/mastodon/messaging/contacts.scss
new file mode 100644
index 000000000..0146e7666
--- /dev/null
+++ b/app/javascript/styles/mastodon/messaging/contacts.scss
@@ -0,0 +1,16 @@
+
+.contact-list-container {
+ overflow-x: auto;
+}
+
+.contact-list {
+ display: block;
+ padding: 1em;
+ min-height: 5em;
+ list-style-type: none;
+ color: white;
+
+ .contact {
+ margin-bottom: 0.5rem;
+ }
+}
diff --git a/app/javascript/styles/mastodon/messaging/helpers.scss b/app/javascript/styles/mastodon/messaging/helpers.scss
new file mode 100644
index 000000000..556b7529c
--- /dev/null
+++ b/app/javascript/styles/mastodon/messaging/helpers.scss
@@ -0,0 +1,16 @@
+.fixed-box {
+ border: solid 1px white;
+ padding: 1em;
+ position: fixed;
+ bottom: 0;
+}
+
+.airmail-border {
+ border: 0.25em solid transparent;
+ border-image: 4 repeating-linear-gradient(-45deg, red 0, red 1em, white 0, white 2em,
+ #58a 0, #58a 3em, white 0, white 4em);
+ border-right-width: 0;
+ border-bottom-width: 0;
+ border-top-width: 0;
+
+}
diff --git a/app/javascript/styles/mastodon/messaging/main.scss b/app/javascript/styles/mastodon/messaging/main.scss
new file mode 100644
index 000000000..b5b81fc6b
--- /dev/null
+++ b/app/javascript/styles/mastodon/messaging/main.scss
@@ -0,0 +1,6 @@
+@import "config";
+@import "helpers";
+@import "messaging";
+@import "contacts";
+@import "messaging-conversation";
+@import "messaging-stream";
diff --git a/app/javascript/styles/mastodon/messaging/messaging-conversation.scss b/app/javascript/styles/mastodon/messaging/messaging-conversation.scss
new file mode 100644
index 000000000..f646f0b73
--- /dev/null
+++ b/app/javascript/styles/mastodon/messaging/messaging-conversation.scss
@@ -0,0 +1,87 @@
+.main-instant-messaging {
+
+ .conversation {
+
+
+ .conversation__content {
+ padding-right: 0;
+ }
+
+ .conversation_reply,
+ .icon-button {
+ &:hover {
+ color: $ui-highlight-color;
+ background: mix($ui-base-color, $ui-secondary-color);
+ }
+ }
+
+ .conversation_reply,
+ .icon-button,
+ .status__action-bar-dropdown {
+ display: inline-block;
+ float: right;
+ width: 18em;
+ height: 3.2em;
+ text-align: center;
+ }
+ }
+
+ .conversations_list {
+ @extend .fixed-box;
+ right: $messagingBoxWidth + 2em;
+ bottom: 0;
+ width: 100%;
+ padding: 0.5em;
+ overflow-x: auto;
+ border: 0;
+ }
+
+ .conversation-item {
+ float: right;
+ width: 20em;
+ margin-left: 2em;
+ padding: 1em;
+ border-radius: 15px;
+ border: 3px solid $classic-primary-color;
+ -moz-border-radius-bottomleft: 0;
+ -moz-border-radius-bottomright: 0;
+ background: $classic-base-color;
+
+
+ &.has-new-message {
+ background: $ui-highlight-color;
+ color: $classic-primary-color;
+ }
+
+ &.is-focused {
+ border-color: $ui-base-color;
+ }
+
+ .username {
+ font-weight: bold;
+ }
+
+ .conversation-stream,
+ .conversation_input {
+ height: 100%;
+ display: block;
+ }
+
+ &.hidden {
+ .conversation-stream,
+ .conversation_input {
+ display: none;
+ }
+ }
+
+ .btn {
+ background: $classic-base-color;
+ color: $ui-base-color;
+ float: right;
+ padding: 0 1em;
+ margin-left: 1em;
+ border: 0;
+ }
+ }
+
+}
diff --git a/app/javascript/styles/mastodon/messaging/messaging-stream.scss b/app/javascript/styles/mastodon/messaging/messaging-stream.scss
new file mode 100644
index 000000000..4d7051e24
--- /dev/null
+++ b/app/javascript/styles/mastodon/messaging/messaging-stream.scss
@@ -0,0 +1,55 @@
+
+.conversation-stream {
+ padding-top: 1em;
+ height: 5em;
+ overflow: auto;
+ width: 100%;
+
+
+ .message {
+ clear: both;
+ }
+
+ .messages >
+ .message {
+ -webkit-border-radius: 0.5rem;
+ -moz-border-radius: 0.5rem;
+ border-radius: 0.5rem;
+ margin-bottom: 0.5em;
+ padding: 0.5em 1em;
+ display: block;
+ }
+
+ .ours {
+ text-align: right;
+ background: $light-text-color;
+ float: right;
+
+ .arrow-down {
+ border-top-color: $light-text-color;
+ left: 100%;
+ }
+ }
+
+ .theirs {
+ text-align: left;
+ background: $ui-highlight-color;
+ float: left;
+
+ .arrow-down {
+ border-top-color: $ui-highlight-color;
+ right: 1em;
+ }
+ }
+
+ .arrow-down {
+ width: 0;
+ height: 0;
+ border-left: 10px solid transparent;
+ border-right: 20px solid transparent;
+ border-top: 20px solid $classic-primary-color;
+ position: relative;
+ bottom: -1em;
+
+ }
+}
diff --git a/app/javascript/styles/mastodon/messaging/messaging.scss b/app/javascript/styles/mastodon/messaging/messaging.scss
new file mode 100644
index 000000000..4c4e47657
--- /dev/null
+++ b/app/javascript/styles/mastodon/messaging/messaging.scss
@@ -0,0 +1,54 @@
+
+.status-direct,
+.item-list .conversation {
+ @extend .airmail-border;
+}
+
+.main-instant-messaging {
+
+ .column-header__icon {
+ color: white;
+ }
+}
+
+.messaging-box {
+ @extend .fixed-box;
+
+ right: 1em;
+ width: $messagingBoxWidth;
+ background: $ui-base-color;
+ height: 4em;
+ color: white;
+ z-index: 10;
+
+ &.active {
+ height: $messagingBoxHeight;
+ }
+
+ .messager-textarea {
+ width: 100%;
+ }
+
+ .title {
+ color: white;
+ }
+
+}
+
+
+.toggle-list {
+ float: right;
+ margin-left: 1em;
+ background: $ui-primary-color;
+ border: 0;
+ padding: .5em;
+ width: 2em;
+
+ &.active {
+ background: $highlight-text-color;
+ }
+}
+
+.conversation_created-at {
+ margin-right: 1em;
+}
diff --git a/app/javascript/styles/mastodon/variables.scss b/app/javascript/styles/mastodon/variables.scss
index 71a46d10f..4bd35ce66 100644
--- a/app/javascript/styles/mastodon/variables.scss
+++ b/app/javascript/styles/mastodon/variables.scss
@@ -1,18 +1,18 @@
// Commonly used web colors
-$black: #000000; // Black
-$white: #ffffff; // White
-$success-green: #79bd9a !default; // Padua
-$error-red: #df405a !default; // Cerise
-$warning-red: #ff5050 !default; // Sunset Orange
-$gold-star: #ca8f04 !default; // Dark Goldenrod
+$black: #000000; // Black
+$white: #ffffff; // White
+$success-green: #79bd9a !default; // Padua
+$error-red: #df405a !default; // Cerise
+$warning-red: #ff5050 !default; // Sunset Orange
+$gold-star: #ca8f04 !default; // Dark Goldenrod
$red-bookmark: $warning-red;
// Values from the classic Mastodon UI
-$classic-base-color: #282c37; // Midnight Express
-$classic-primary-color: #9baec8; // Echo Blue
-$classic-secondary-color: #d9e1e8; // Pattens Blue
-$classic-highlight-color: #2b90d9; // Summer Sky
+$classic-base-color: #282c37; // Midnight Express
+$classic-primary-color: #9baec8; // Echo Blue
+$classic-secondary-color: #d9e1e8; // Pattens Blue
+$classic-highlight-color: #2b90d9; // Summer Sky
// Variables for defaults in UI
$base-shadow-color: $black !default;
@@ -23,10 +23,10 @@ $valid-value-color: $success-green !default;
$error-value-color: $error-red !default;
// Tell UI to use selected colors
-$ui-base-color: $classic-base-color !default; // Darkest
+$ui-base-color: $classic-base-color !default; // Darkest
$ui-base-lighter-color: lighten($ui-base-color, 26%) !default; // Lighter darkest
-$ui-primary-color: $classic-primary-color !default; // Lighter
-$ui-secondary-color: $classic-secondary-color !default; // Lightest
+$ui-primary-color: $classic-primary-color !default; // Lighter
+$ui-secondary-color: $classic-secondary-color !default; // Lightest
$ui-highlight-color: $classic-highlight-color !default;
// Variables for texts
@@ -76,3 +76,5 @@ $no-gap-breakpoint: 415px;
$font-sans-serif: 'mastodon-font-sans-serif' !default;
$font-display: 'mastodon-font-display' !default;
$font-monospace: 'mastodon-font-monospace' !default;
+
+$avatar-side: 55px;
diff --git a/app/javascript/styles/mastodon/widgets.scss b/app/javascript/styles/mastodon/widgets.scss
index ca050a8d9..92d84d995 100644
--- a/app/javascript/styles/mastodon/widgets.scss
+++ b/app/javascript/styles/mastodon/widgets.scss
@@ -372,8 +372,8 @@
.account__avatar {
flex: 0 0 auto;
- width: 36px;
- height: 36px;
+ width: $avatar-side;
+ height: $avatar-side;
border-radius: 50%;
position: relative;
margin-left: -10px;
diff --git a/app/lib/activitypub/activity.rb b/app/lib/activitypub/activity.rb
index 0ca6b92a4..49b1dc9cd 100644
--- a/app/lib/activitypub/activity.rb
+++ b/app/lib/activitypub/activity.rb
@@ -5,7 +5,7 @@ class ActivityPub::Activity
include Redisable
SUPPORTED_TYPES = %w(Note Question).freeze
- CONVERTED_TYPES = %w(Image Audio Video Article Page).freeze
+ CONVERTED_TYPES = %w(Image Audio Video Article Page Event).freeze
def initialize(json, account, **options)
@json = json
diff --git a/app/lib/activitypub/activity/create.rb b/app/lib/activitypub/activity/create.rb
index 8a12a2b08..c55cfe08e 100644
--- a/app/lib/activitypub/activity/create.rb
+++ b/app/lib/activitypub/activity/create.rb
@@ -157,7 +157,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
return if tag['name'].blank?
Tag.find_or_create_by_names(tag['name']) do |hashtag|
- @tags << hashtag unless @tags.include?(hashtag)
+ @tags << hashtag unless @tags.include?(hashtag) || !hashtag.valid?
end
rescue ActiveRecord::RecordInvalid
nil
@@ -167,7 +167,7 @@ class ActivityPub::Activity::Create < ActivityPub::Activity
return if tag['href'].blank?
account = account_from_uri(tag['href'])
- account = ::FetchRemoteAccountService.new.call(tag['href']) if account.nil?
+ account = ActivityPub::FetchRemoteAccountService.new.call(tag['href']) if account.nil?
return if account.nil?
diff --git a/app/models/backup.rb b/app/models/backup.rb
index c2651313b..8eeb1748a 100644
--- a/app/models/backup.rb
+++ b/app/models/backup.rb
@@ -7,7 +7,7 @@
# user_id :bigint(8)
# dump_file_name :string
# dump_content_type :string
-# dump_file_size :integer
+# dump_file_size :bigint
# dump_updated_at :datetime
# processed :boolean default(FALSE), not null
# created_at :datetime not null
diff --git a/app/models/form/admin_settings.rb b/app/models/form/admin_settings.rb
index 70e9c21f1..390836f28 100644
--- a/app/models/form/admin_settings.rb
+++ b/app/models/form/admin_settings.rb
@@ -16,6 +16,7 @@ class Form::AdminSettings
open_deletion
timeline_preview
show_staff_badge
+ enable_bootstrap_timeline_accounts
bootstrap_timeline_accounts
theme
min_invite_role
@@ -40,6 +41,7 @@ class Form::AdminSettings
open_deletion
timeline_preview
show_staff_badge
+ enable_bootstrap_timeline_accounts
activity_api_enabled
peers_api_enabled
show_known_fediverse_at_about_page
diff --git a/app/models/form/custom_emoji_batch.rb b/app/models/form/custom_emoji_batch.rb
index 076e8c9e3..6b7ea5355 100644
--- a/app/models/form/custom_emoji_batch.rb
+++ b/app/models/form/custom_emoji_batch.rb
@@ -40,7 +40,7 @@ class Form::CustomEmojiBatch
if category_id.present?
CustomEmojiCategory.find(category_id)
elsif category_name.present?
- CustomEmojiCategory.create!(name: category_name)
+ CustomEmojiCategory.find_or_create_by!(name: category_name)
end
end
diff --git a/app/models/tag.rb b/app/models/tag.rb
index d3a7e1e6d..bce76fc16 100644
--- a/app/models/tag.rb
+++ b/app/models/tag.rb
@@ -117,7 +117,7 @@ class Tag < ApplicationRecord
class << self
def find_or_create_by_names(name_or_names)
Array(name_or_names).map(&method(:normalize)).uniq { |str| str.mb_chars.downcase.to_s }.map do |normalized_name|
- tag = matching_name(normalized_name).first || create!(name: normalized_name)
+ tag = matching_name(normalized_name).first || create(name: normalized_name)
yield tag if block_given?
diff --git a/app/services/backup_service.rb b/app/services/backup_service.rb
index fe26d7aa0..fba2d19a0 100644
--- a/app/services/backup_service.rb
+++ b/app/services/backup_service.rb
@@ -3,6 +3,8 @@
require 'rubygems/package'
class BackupService < BaseService
+ include Payloadable
+
attr_reader :account, :backup, :collection
def call(backup)
@@ -20,7 +22,7 @@ class BackupService < BaseService
account.statuses.with_includes.reorder(nil).find_in_batches do |statuses|
statuses.each do |status|
- item = serialize(status, ActivityPub::ActivitySerializer)
+ item = serialize_payload(status, ActivityPub::ActivitySerializer, signer: @account)
item.delete(:'@context')
unless item[:type] == 'Announce' || item[:object][:attachment].blank?
diff --git a/app/services/bootstrap_timeline_service.rb b/app/services/bootstrap_timeline_service.rb
index c489601c1..8412aa7e7 100644
--- a/app/services/bootstrap_timeline_service.rb
+++ b/app/services/bootstrap_timeline_service.rb
@@ -5,7 +5,7 @@ class BootstrapTimelineService < BaseService
@source_account = source_account
autofollow_inviter!
- autofollow_bootstrap_timeline_accounts!
+ autofollow_bootstrap_timeline_accounts! if Setting.enable_bootstrap_timeline_accounts
end
private
diff --git a/app/services/fetch_link_card_service.rb b/app/services/fetch_link_card_service.rb
index 5d4a7c303..91141c1f5 100644
--- a/app/services/fetch_link_card_service.rb
+++ b/app/services/fetch_link_card_service.rb
@@ -45,7 +45,7 @@ class FetchLinkCardService < BaseService
def html
return @html if defined?(@html)
- Request.new(:get, @url).perform do |res|
+ Request.new(:get, @url).add_headers('Accept' => 'text/html').perform do |res|
if res.code == 200 && res.mime_type == 'text/html'
@html = res.body_with_limit
@html_charset = res.charset
diff --git a/app/services/fetch_oembed_service.rb b/app/services/fetch_oembed_service.rb
index 76d971bc5..67e33875c 100644
--- a/app/services/fetch_oembed_service.rb
+++ b/app/services/fetch_oembed_service.rb
@@ -93,7 +93,7 @@ class FetchOEmbedService
def html
return @html if defined?(@html)
- @html = @options[:html] || Request.new(:get, @url).perform do |res|
+ @html = @options[:html] || Request.new(:get, @url).add_headers('Accept' => 'text/html').perform do |res|
res.code != 200 || res.mime_type != 'text/html' ? nil : res.body_with_limit
end
end
diff --git a/app/services/fetch_remote_account_service.rb b/app/services/fetch_remote_account_service.rb
deleted file mode 100644
index 3cd06e30f..000000000
--- a/app/services/fetch_remote_account_service.rb
+++ /dev/null
@@ -1,17 +0,0 @@
-# frozen_string_literal: true
-
-class FetchRemoteAccountService < BaseService
- def call(url, prefetched_body = nil, protocol = :ostatus)
- if prefetched_body.nil?
- resource_url, resource_options, protocol = FetchResourceService.new.call(url)
- else
- resource_url = url
- resource_options = { prefetched_body: prefetched_body }
- end
-
- case protocol
- when :activitypub
- ActivityPub::FetchRemoteAccountService.new.call(resource_url, **resource_options)
- end
- end
-end
diff --git a/app/services/fetch_remote_status_service.rb b/app/services/fetch_remote_status_service.rb
index 208dc7809..eafde4d4a 100644
--- a/app/services/fetch_remote_status_service.rb
+++ b/app/services/fetch_remote_status_service.rb
@@ -1,17 +1,14 @@
# frozen_string_literal: true
class FetchRemoteStatusService < BaseService
- def call(url, prefetched_body = nil, protocol = :ostatus)
+ def call(url, prefetched_body = nil)
if prefetched_body.nil?
- resource_url, resource_options, protocol = FetchResourceService.new.call(url)
+ resource_url, resource_options = FetchResourceService.new.call(url)
else
resource_url = url
resource_options = { prefetched_body: prefetched_body }
end
- case protocol
- when :activitypub
- ActivityPub::FetchRemoteStatusService.new.call(resource_url, **resource_options)
- end
+ ActivityPub::FetchRemoteStatusService.new.call(resource_url, **resource_options) unless resource_url.nil?
end
end
diff --git a/app/services/fetch_resource_service.rb b/app/services/fetch_resource_service.rb
index 3676d899d..34382d279 100644
--- a/app/services/fetch_resource_service.rb
+++ b/app/services/fetch_resource_service.rb
@@ -33,7 +33,7 @@ class FetchResourceService < BaseService
body = response.body_with_limit
json = body_to_json(body)
- [json['id'], { prefetched_body: body, id: true }, :activitypub] if supported_context?(json) && (equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES) || expected_type?(json))
+ [json['id'], { prefetched_body: body, id: true }] if supported_context?(json) && (equals_or_includes_any?(json['type'], ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES) || expected_type?(json))
elsif !terminal
link_header = response['Link'] && parse_link_header(response)
diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb
index 4e971a4b8..79b1bad0c 100644
--- a/app/services/resolve_url_service.rb
+++ b/app/services/resolve_url_service.rb
@@ -19,9 +19,9 @@ class ResolveURLService < BaseService
def process_url
if equals_or_includes_any?(type, ActivityPub::FetchRemoteAccountService::SUPPORTED_TYPES)
- FetchRemoteAccountService.new.call(resource_url, body, protocol)
+ ActivityPub::FetchRemoteAccountService.new.call(resource_url, prefetched_body: body)
elsif equals_or_includes_any?(type, ActivityPub::Activity::Create::SUPPORTED_TYPES + ActivityPub::Activity::Create::CONVERTED_TYPES)
- status = FetchRemoteStatusService.new.call(resource_url, body, protocol)
+ status = FetchRemoteStatusService.new.call(resource_url, body)
authorize_with @on_behalf_of, status, :show? unless status.nil?
status
elsif fetched_resource.nil? && @on_behalf_of.present?
@@ -45,12 +45,8 @@ class ResolveURLService < BaseService
fetched_resource.second[:prefetched_body]
end
- def protocol
- fetched_resource.third
- end
-
def type
- return json_data['type'] if protocol == :activitypub
+ json_data['type']
end
def json_data
diff --git a/app/views/admin/reports/show.html.haml b/app/views/admin/reports/show.html.haml
index aee9a3aef..7f3ec35a4 100644
--- a/app/views/admin/reports/show.html.haml
+++ b/app/views/admin/reports/show.html.haml
@@ -4,21 +4,12 @@
- content_for :page_title do
= t('admin.reports.report', id: @report.id)
-%div{ style: 'overflow: hidden; margin-bottom: 20px' }
+- content_for :page_heading_actions do
- if @report.unresolved?
- %div{ style: 'float: right' }
- - if @report.target_account.local?
- = link_to t('admin.accounts.warn'), new_admin_account_action_path(@report.target_account_id, type: 'none', report_id: @report.id), class: 'button'
- = link_to t('admin.accounts.disable'), new_admin_account_action_path(@report.target_account_id, type: 'disable', report_id: @report.id), class: 'button button--destructive'
- = link_to t('admin.accounts.silence'), new_admin_account_action_path(@report.target_account_id, type: 'silence', report_id: @report.id), class: 'button button--destructive'
- = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(@report.target_account_id, type: 'suspend', report_id: @report.id), class: 'button button--destructive'
- %div{ style: 'float: left' }
- = link_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(@report), method: :post, class: 'button'
+ = link_to t('admin.reports.mark_as_resolved'), resolve_admin_report_path(@report), method: :post, class: 'button'
- else
= link_to t('admin.reports.mark_as_unresolved'), reopen_admin_report_path(@report), method: :post, class: 'button'
-%hr.spacer
-
.table-wrapper
%table.table.inline-table
%tbody
@@ -77,6 +68,17 @@
%hr.spacer
+%div{ style: 'overflow: hidden; margin-bottom: 20px; clear: both' }
+ - if @report.unresolved?
+ %div{ style: 'float: right' }
+ - if @report.target_account.local?
+ = link_to t('admin.accounts.warn'), new_admin_account_action_path(@report.target_account_id, type: 'none', report_id: @report.id), class: 'button'
+ = link_to t('admin.accounts.disable'), new_admin_account_action_path(@report.target_account_id, type: 'disable', report_id: @report.id), class: 'button button--destructive'
+ = link_to t('admin.accounts.silence'), new_admin_account_action_path(@report.target_account_id, type: 'silence', report_id: @report.id), class: 'button button--destructive'
+ = link_to t('admin.accounts.perform_full_suspension'), new_admin_account_action_path(@report.target_account_id, type: 'suspend', report_id: @report.id), class: 'button button--destructive'
+
+%hr.spacer
+
.speech-bubble
.speech-bubble__bubble= simple_format(@report.comment.presence || t('admin.reports.comment.none'))
.speech-bubble__owner
diff --git a/app/views/admin/settings/edit.html.haml b/app/views/admin/settings/edit.html.haml
index 6282bb39c..d7b493051 100644
--- a/app/views/admin/settings/edit.html.haml
+++ b/app/views/admin/settings/edit.html.haml
@@ -1,3 +1,6 @@
+- content_for :header_tags do
+ = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'
+
- content_for :page_title do
= t('admin.settings.title')
@@ -38,7 +41,9 @@
%hr.spacer/
.fields-group
- = f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html')
+ = f.input :enable_bootstrap_timeline_accounts, as: :boolean, wrapper: :with_label, label: t('admin.settings.enable_bootstrap_timeline_accounts.title')
+ .fields-group
+ = f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html'), disabled: !Setting.enable_bootstrap_timeline_accounts
%hr.spacer/
diff --git a/app/views/layouts/admin.html.haml b/app/views/layouts/admin.html.haml
index 57bda45e2..059bf8579 100644
--- a/app/views/layouts/admin.html.haml
+++ b/app/views/layouts/admin.html.haml
@@ -21,7 +21,12 @@
.content-wrapper
.content
- %h2= yield :page_title
+ .content-heading
+ %h2= yield :page_title
+
+ - if :page_heading_actions
+ .content-heading-actions
+ = yield :page_heading_actions
= render 'application/flashes'
diff --git a/app/views/settings/exports/show.html.haml b/app/views/settings/exports/show.html.haml
index 76ff76bd9..0bb80e937 100644
--- a/app/views/settings/exports/show.html.haml
+++ b/app/views/settings/exports/show.html.haml
@@ -9,11 +9,11 @@
%td= number_to_human_size @export.total_storage
%td
%tr
- %th= t('accounts.posts', count: @export.total_statuses)
+ %th= t('accounts.posts_tab_heading')
%td= number_with_delimiter @export.total_statuses
%td
%tr
- %th= t('exports.follows')
+ %th= t('admin.accounts.follows')
%td= number_with_delimiter @export.total_follows
%td= table_link_to 'download', t('exports.csv'), settings_exports_follows_path(format: :csv)
%tr
@@ -21,7 +21,7 @@
%td= number_with_delimiter @export.total_lists
%td= table_link_to 'download', t('exports.csv'), settings_exports_lists_path(format: :csv)
%tr
- %th= t('accounts.followers', count: @export.total_followers)
+ %th= t('admin.accounts.followers')
%td= number_with_delimiter @export.total_followers
%td
%tr
diff --git a/app/views/settings/profiles/show.html.haml b/app/views/settings/profiles/show.html.haml
index 6929f54f3..746b6c53d 100644
--- a/app/views/settings/profiles/show.html.haml
+++ b/app/views/settings/profiles/show.html.haml
@@ -21,7 +21,7 @@
%hr.spacer/
.fields-group
- = f.input :locked, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.locked')
+ = f.input :locked, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.locked'), recommended: true
.fields-group
= f.input :bot, as: :boolean, wrapper: :with_label, hint: t('simple_form.hints.defaults.bot')
@@ -32,25 +32,27 @@
%hr.spacer/
- .fields-row
- .fields-row__column.fields-group.fields-row__column-6
- .input.with_block_label
+ .custom-label-container
+ .fields-group.custom_labels_container
+ .with_block_label
%label= t('simple_form.labels.defaults.fields')
%span.hint= t('simple_form.hints.defaults.fields')
= f.simple_fields_for :fields do |fields_f|
- .row
- = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name'), input_html: { maxlength: 255 }
- = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value'), input_html: { maxlength: 255 }
+ .columns
+ .column.tag-side
+ = fields_f.input :name, placeholder: t('simple_form.labels.account.fields.name'), input_html: { maxlength: 255 }
+ .column.value-side
+ = fields_f.input :value, placeholder: t('simple_form.labels.account.fields.value'), input_html: { maxlength: 255 }
- .fields-row__column.fields-group.fields-row__column-6
- %h6= t('verification.verification')
- %p.hint= t('verification.explanation_html')
+ .fields-group.verification-container
+ %h6= t('verification.verification')
+ %p.hint= t('verification.explanation_html')
- .input-copy
- .input-copy__wrapper
- %input{ type: :text, maxlength: '999', spellcheck: 'false', readonly: 'true', value: link_to('Mastodon', ActivityPub::TagManager.instance.url_for(@account), rel: 'me').to_str }
- %button{ type: :button }= t('generic.copy')
+ .input-copy
+ .input-copy__wrapper
+ %input{ type: :text, maxlength: '999', spellcheck: 'false', readonly: 'true', value: link_to('Mastodon', ActivityPub::TagManager.instance.url_for(@account), rel: 'me').to_str }
+ %button{ type: :button }= t('generic.copy')
.actions
= f.button :button, t('generic.save_changes'), type: :submit
diff --git a/boxfile.yml b/boxfile.yml
index 1bc3929c8..c4fd19ce6 100644
--- a/boxfile.yml
+++ b/boxfile.yml
@@ -60,16 +60,15 @@ deploy.config:
- touch /app/log/production.log
before_live:
web.web:
+ - bin/tootctl cache clear
- bundle exec rake db:migrate:setup
+ after_live:
+ worker.sidekiq:
- |-
if [[ "${ES_ENABLED}" != "false" ]]
then
bin/tootctl search deploy
fi
- - bin/tootctl cache clear
- after_live:
- worker.sidekiq:
- - bin/tootctl search deploy
web.web:
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 340d720ae..835e96769 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -124,9 +124,7 @@ ar:
email_status: حالة البريد الإلكتروني
enable: تفعيل
enabled: مفعَّل
- feed_url: عنوان رابط التغذية
followers: المتابِعون
- followers_url: عنوان رابط المتابِعين
follows: يتابع
header: الرأسية
inbox_url: رابط صندوق الوارد
@@ -154,10 +152,8 @@ ar:
no_account_selected: لم يطرأ أي تغيير على أي حساب بما أنه لم يتم اختيار أي واحد
no_limits_imposed: مِن دون حدود مشروطة
not_subscribed: غير مشترك
- outbox_url: رابط صندوق الصادر
pending: في انتظار المراجعة
perform_full_suspension: تعليق الحساب
- profile_url: رابط الصفحة التعريفية
promote: ترقية
protocol: البروتوكول
public: عمومي
@@ -180,7 +176,6 @@ ar:
moderator: مشرف
staff: الفريق
user: مستخدِم
- salmon_url: عنوان رابط سالمون Salmon
search: البحث
shared_inbox_url: رابط الصندوق المُشترَك للبريد الوارد
show:
diff --git a/config/locales/bn.yml b/config/locales/bn.yml
index 24f0a654a..7dd49ff96 100644
--- a/config/locales/bn.yml
+++ b/config/locales/bn.yml
@@ -118,9 +118,7 @@ bn:
email_status: ইমেইলের অবস্থা
enable: চালু করুন
enabled: চালু করুন
- feed_url: সম্মিলিত(feed) লিংক
followers: অনুসরকারীরা
- followers_url: অনুসরণকারীদের লিংক
follows: অনুসরণ করে
header: শিরোলেখা
inbox_url: চিঠি পাওয়ার বক্স লিংক
@@ -148,10 +146,8 @@ bn:
no_account_selected: কোনও অ্যাকাউন্টই নির্বাচন করা হয়নি বলে কোনও অ্যাকাউন্ট পরিবর্তন করা হয়নি
no_limits_imposed: কোন সীমা আরোপ করা নেই
not_subscribed: সাবস্ক্রাইব নেই
- outbox_url: চিঠি পাঠানোর বাক্স লিংক
pending: পয্র্যবেক্ষণের অপেক্ষায় আছে
perform_full_suspension: বাতিল করা
- profile_url: প্রোফাইল URL
promote: প্রচার
protocol: প্রোটোকল
public: সর্বজনীন
@@ -174,7 +170,6 @@ bn:
moderator: নিয়ামক
staff: কর্মী
user: ব্যবহারকারী
- salmon_url: সালমন URL
search: অনুসন্ধান
search_same_ip: একই IP সহ অন্যান্য ব্যবহারকারীরা
shared_inbox_url: ভাগ করা ইনবক্স URL
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index 1331299cc..c3cfe3083 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -118,9 +118,7 @@ ca:
email_status: Estat del correu electrònic
enable: Habilita
enabled: Habilitat
- feed_url: URL del canal
followers: Seguidors
- followers_url: URL dels seguidors
follows: Segueix
header: Capçalera
inbox_url: URL de la safata d'entrada
@@ -148,10 +146,8 @@ ca:
no_account_selected: No s'han canviat els comptes perque no s'han seleccionat
no_limits_imposed: Sense límits imposats
not_subscribed: No subscrit
- outbox_url: URL de la bústia de sortida
pending: Revisió pendent
perform_full_suspension: Suspèn
- profile_url: URL del perfil
promote: Promociona
protocol: Protocol
public: Públic
@@ -174,7 +170,6 @@ ca:
moderator: Moderador
staff: Personal
user: Usuari
- salmon_url: URL Salmon
search: Cerca
search_same_ip: Altres usuaris amb la mateixa IP
shared_inbox_url: URL de la safata d'entrada compartida
diff --git a/config/locales/co.yml b/config/locales/co.yml
index c71df77c1..9653363ca 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -118,9 +118,7 @@ co:
email_status: Statutu di l’e-mail
enable: Attivà
enabled: Attivatu
- feed_url: URL di u flussu
followers: Abbunati
- followers_url: URL di l’abbunati
follows: Abbunamenti
header: Intistatura
inbox_url: URL di l’inbox
@@ -148,10 +146,8 @@ co:
no_account_selected: Nisun contu hè statu cambiatu postu ch'ùn c'eranu micca selezziunati
no_limits_imposed: Nisuna limita imposta
not_subscribed: Micca abbunatu
- outbox_url: URL di l’outbox
pending: In attesa di rivista
perform_full_suspension: Suspende
- profile_url: URL di u prufile
promote: Prumove
protocol: Prutucollu
public: Pubblicu
@@ -174,7 +170,6 @@ co:
moderator: Muderatore
staff: Squadra
user: Utilizatore
- salmon_url: URL di Salmon
search: Cercà
search_same_ip: Altri utilizatori cù listessa IP
shared_inbox_url: URL di l’inbox spartuta
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 51503ed70..81ae22680 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -126,9 +126,7 @@ cs:
email_status: Stav e-mailu
enable: Povolit
enabled: Povoleno
- feed_url: URL proudu
followers: Sledující
- followers_url: URL sledujících
follows: Sledovaní
header: Záhlaví
inbox_url: URL příchozí schránky
@@ -156,10 +154,8 @@ cs:
no_account_selected: Nebyl změněn žádný účet, neboť žádný nebyl zvolen
no_limits_imposed: Nejsou nastavena žádná omezení
not_subscribed: Neodebírá
- outbox_url: URL odchozí schránky
pending: Čeká na posouzení
perform_full_suspension: Pozastavit
- profile_url: URL profilu
promote: Povýšit
protocol: Protokol
public: Veřejný
@@ -182,7 +178,6 @@ cs:
moderator: Moderátor
staff: Člen personálu
user: Uživatel
- salmon_url: URL Salmon
search: Hledat
search_same_ip: Další uživatelé se stejnou IP adresou
shared_inbox_url: URL sdílené příchozí schránky
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index f360db211..fde22cc33 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -133,9 +133,7 @@ cy:
email_status: Statws E-bost
enable: Galluogi
enabled: Wedi ei alluogi
- feed_url: Ffrwd URL
followers: Dilynwyr
- followers_url: URL Dilynwyr
follows: Yn dilyn
header: Pennawd
inbox_url: URL Mewnflwch
@@ -163,10 +161,8 @@ cy:
no_account_selected: Ni newidwyd dim cyfrif achos ni ddewiswyd dim un
no_limits_imposed: Dim terfynau wedi'i gosod
not_subscribed: Heb danysgrifio
- outbox_url: Allflwch URL
pending: Yn aros am adolygiad
perform_full_suspension: Atal
- profile_url: URL proffil
promote: Hyrwyddo
protocol: Protocol
public: Cyhoeddus
@@ -189,7 +185,6 @@ cy:
moderator: Aroglygydd
staff: Staff
user: Defnyddiwr
- salmon_url: URL Eog
search: Chwilio
search_same_ip: Defnyddwyr eraill gyda'r un IP
shared_inbox_url: URL Mewnflwch wedi ei rannu
diff --git a/config/locales/da.yml b/config/locales/da.yml
index 149e7da2b..57f4ed879 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -96,9 +96,7 @@ da:
edit: Rediger
enable: Aktiver
enabled: Aktiveret
- feed_url: Link til feed
followers: Følgere
- followers_url: Link til følgere
follows: Følger
inbox_url: Link til indbakke
invited_by: Inviteret af
@@ -123,9 +121,7 @@ da:
most_recent_activity: Seneste aktivitet
most_recent_ip: Senest IP
not_subscribed: Ikke abonneret
- outbox_url: Link til udgående
perform_full_suspension: Udeluk
- profile_url: Link til profil
promote: Forfrem
protocol: Protokol
public: Offentligt
@@ -147,7 +143,6 @@ da:
moderator: Mod
staff: Personale
user: Bruger
- salmon_url: Salmon-URL
search: Søg
search_same_ip: Andre brugere med den samme IP-adresse
shared_inbox_url: Link til delt indbakke
diff --git a/config/locales/de.yml b/config/locales/de.yml
index d27c6b105..445205871 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -118,9 +118,7 @@ de:
email_status: E-Mail-Status
enable: Freischalten
enabled: Freigegeben
- feed_url: Feed-URL
followers: Folgende
- followers_url: URL des Folgenden
follows: Folgt
header: Titelbild
inbox_url: Posteingangs-URL
@@ -148,10 +146,8 @@ de:
no_account_selected: Keine Konten wurden geändert, da keine ausgewählt wurden
no_limits_imposed: Keine Beschränkungen
not_subscribed: Nicht abonniert
- outbox_url: Postausgangs-URL
pending: In Warteschlange
perform_full_suspension: Verbannen
- profile_url: Profil-URL
promote: Befördern
protocol: Protokoll
public: Öffentlich
@@ -174,7 +170,6 @@ de:
moderator: Moderator_in
staff: Mitarbeiter
user: Nutzer
- salmon_url: Salmon-URL
search: Suche
search_same_ip: Andere Benutzer mit derselben IP
shared_inbox_url: Geteilte Posteingang-URL
diff --git a/config/locales/el.yml b/config/locales/el.yml
index cb1694573..585eefab4 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -118,9 +118,7 @@ el:
email_status: Κατάσταση email
enable: Ενεργοποίηση
enabled: Ενεργοποιημένο
- feed_url: URL ροής
followers: Ακόλουθοι
- followers_url: URL ακολούθων
follows: Ακολουθεί
header: Επικεφαλίδα
inbox_url: URL εισερχομένων
@@ -148,10 +146,8 @@ el:
no_account_selected: Κανείς λογαριασμός δεν ενημερώθηκε αφού κανείς δεν ήταν επιλεγμένος
no_limits_imposed: Χωρίς όρια
not_subscribed: Άνευ συνδρομής
- outbox_url: URL εξερχομένων
pending: Εκκρεμεί έγκριση
perform_full_suspension: Αναστολή
- profile_url: URL προφίλ
promote: Προβίβασε
protocol: Πρωτόκολλο
public: Δημόσιο
@@ -174,7 +170,6 @@ el:
moderator: Συντονιστής
staff: Προσωπικό
user: Χρήστης
- salmon_url: URL Salmon
search: Αναζήτηση
search_same_ip: Υπόλοιποι χρήστες με την ίδια διεύθυνση IP
shared_inbox_url: URL κοινόχρηστων εισερχομένων
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ea94928e7..c7179d304 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -119,9 +119,7 @@ en:
email_status: Email status
enable: Enable
enabled: Enabled
- feed_url: Feed URL
followers: Followers
- followers_url: Followers URL
follows: Follows
header: Header
inbox_url: Inbox URL
@@ -149,10 +147,8 @@ en:
no_account_selected: No accounts were changed as none were selected
no_limits_imposed: No limits imposed
not_subscribed: Not subscribed
- outbox_url: Outbox URL
pending: Pending review
perform_full_suspension: Suspend
- profile_url: Profile URL
promote: Promote
protocol: Protocol
public: Public
@@ -175,7 +171,6 @@ en:
moderator: Moderator
staff: Staff
user: User
- salmon_url: Salmon URL
search: Search
search_same_ip: Other users with the same IP
shared_inbox_url: Shared inbox URL
@@ -456,6 +451,8 @@ en:
users: To logged-in local users
domain_blocks_rationale:
title: Show rationale
+ enable_bootstrap_timeline_accounts:
+ title: Enable default follows for new users
hero:
desc_html: Displayed on the frontpage. At least 600x100px recommended. When not set, falls back to server thumbnail
title: Hero image
@@ -722,7 +719,6 @@ en:
blocks: You block
csv: CSV
domain_blocks: Domain blocks
- follows: You follow
lists: Lists
mutes: You mute
storage: Media storage
diff --git a/config/locales/en_GB.yml b/config/locales/en_GB.yml
index 45d3a5bc0..939dfe0c1 100644
--- a/config/locales/en_GB.yml
+++ b/config/locales/en_GB.yml
@@ -105,9 +105,7 @@ en_GB:
email_status: Email status
enable: Enable
enabled: Enabled
- feed_url: Feed URL
followers: Followers
- followers_url: Followers URL
follows: Follows
header: Header
inbox_url: Inbox URL
@@ -134,10 +132,8 @@ en_GB:
most_recent_ip: Most recent IP
no_limits_imposed: No limits imposed
not_subscribed: Not subscribed
- outbox_url: Outbox URL
pending: Pending review
perform_full_suspension: Suspend
- profile_url: Profile URL
promote: Promote
protocol: Protocol
public: Public
@@ -159,7 +155,6 @@ en_GB:
moderator: Moderator
staff: Staff
user: User
- salmon_url: Salmon URL
search: Search
shared_inbox_url: Shared inbox URL
show:
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 432528010..78ea19af5 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -111,9 +111,7 @@ eo:
email_status: Retadreso Stato
enable: Ebligi
enabled: Ebligita
- feed_url: URL de la fluo
followers: Sekvantoj
- followers_url: URL de la sekvantoj
follows: Sekvatoj
header: Kapa bildo
inbox_url: Enira URL
@@ -141,10 +139,8 @@ eo:
no_account_selected: Neniu konto estis ŝanĝita ĉar neniu estis selektita
no_limits_imposed: Neniu limito trudita
not_subscribed: Ne abonita
- outbox_url: Elira URL
pending: Pritraktata recenzo
perform_full_suspension: Haltigi
- profile_url: Profila URL
promote: Plirangigi
protocol: Protokolo
public: Publika
@@ -167,7 +163,6 @@ eo:
moderator: Kontrolanto
staff: Teamo
user: Uzanto
- salmon_url: Salmon-URL
search: Serĉi
shared_inbox_url: URL de kunhavigita leterkesto
show:
diff --git a/config/locales/es-AR.yml b/config/locales/es-AR.yml
index 6515684a3..c52615139 100644
--- a/config/locales/es-AR.yml
+++ b/config/locales/es-AR.yml
@@ -118,9 +118,7 @@ es-AR:
email_status: Estado del correo
enable: Habilitar
enabled: Habilitada
- feed_url: Dirección de la fuente web
followers: Seguidores
- followers_url: Dirección web de los seguidores
follows: Seguidores
header: Cabecera
inbox_url: Dirección web de la bandeja de entrada
@@ -148,10 +146,8 @@ es-AR:
no_account_selected: No se cambió ninguna cuenta ya que ninguna fue seleccionada
no_limits_imposed: Sin límites impuestos
not_subscribed: No suscripto
- outbox_url: Dirección web de la bandeja de salida
pending: Revisión pendiente
perform_full_suspension: Suspender
- profile_url: Dirección web del perfil
promote: Promocionar
protocol: Protocolo
public: Pública
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 4b9cbef2b..1826331b3 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -118,9 +118,7 @@ es:
email_status: E-mail Status
enable: Habilitar
enabled: Habilitada
- feed_url: URL de notificaciones
followers: Seguidores
- followers_url: URL de los seguidores
follows: Sigue
header: Cabecera
inbox_url: URL de la bandeja de entrada
@@ -148,10 +146,8 @@ es:
no_account_selected: Ninguna cuenta se cambió como ninguna fue seleccionada
no_limits_imposed: Sin límites impuestos
not_subscribed: No se está suscrito
- outbox_url: URL de bandeja de salida
pending: Revisión pendiente
perform_full_suspension: Suspender
- profile_url: URL del perfil
promote: Promocionar
protocol: Protocolo
public: Público
@@ -174,7 +170,6 @@ es:
moderator: Moderador
staff: Personal
user: Usuario
- salmon_url: URL de salmón
search: Buscar
search_same_ip: Otros usuarios con la misma IP
shared_inbox_url: URL de bandeja compartida
diff --git a/config/locales/et.yml b/config/locales/et.yml
index 330847161..36a2931af 100644
--- a/config/locales/et.yml
+++ b/config/locales/et.yml
@@ -118,9 +118,7 @@ et:
email_status: E-posti staatus
enable: Luba
enabled: Lubatud
- feed_url: Voogu URL
followers: Jälgijad
- followers_url: Jälgijate URL
follows: Jälgib
header: Päis
inbox_url: Sisendkausta URL
@@ -148,10 +146,8 @@ et:
no_account_selected: Mitte ühtegi kontot muudeti sest midagi polnud valitud
no_limits_imposed: Mitte ühtegi limiiti kehtestatud
not_subscribed: Ei ole tellitud
- outbox_url: Väljundkausta URL
pending: Ootab ülevaatamist
perform_full_suspension: Peata
- profile_url: Profiili URL
promote: Edenda
protocol: Protokoll
public: Avalik
@@ -174,7 +170,6 @@ et:
moderator: Moderaator
staff: Personal
user: Kasutaja
- salmon_url: Salmoni URL
search: Otsi
search_same_ip: Teised kasutajad, kellel on sama IP
shared_inbox_url: Jagatud sisendkausta URL
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index ff8d00df1..9dfe5e9d3 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -118,9 +118,7 @@ eu:
email_status: Posta elektronikoaren egoera
enable: Gaitu
enabled: Gaituta
- feed_url: Jarioaren URL-a
followers: Jarraitzaileak
- followers_url: Jarraitzaileen URL-a
follows: Jarraitzen du
header: Goiburua
inbox_url: Sarrera ontziaren URL-a
@@ -148,10 +146,8 @@ eu:
no_account_selected: Ez da konturik aldatu ez delako bata bera hautatu
no_limits_imposed: Ez da mugarik ezarri
not_subscribed: Harpidetu gabe
- outbox_url: Irteera ontziaren URL-a
pending: Berrikusketa egiteke
perform_full_suspension: Kanporatu
- profile_url: Profilaren URL-a
promote: Sustatu
protocol: Protokoloa
public: Publikoa
@@ -174,7 +170,6 @@ eu:
moderator: Moderatzailea
staff: Langilea
user: Erabiltzailea
- salmon_url: Salmon URL-a
search: Bilatu
search_same_ip: IP bera duten beste erabiltzaileak
shared_inbox_url: Partekatutako sarrera ontziaren URL-a
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 78236432e..02a990a40 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -118,9 +118,7 @@ fa:
email_status: وضعیت ایمیل
enable: فعال
enabled: فعال
- feed_url: نشانی فید
followers: پیگیران
- followers_url: نشانی پیگیران
follows: پی میگیرد
header: زمینه
inbox_url: نشانی صندوق ورودی
@@ -148,10 +146,8 @@ fa:
no_account_selected: هیچ حسابی تغییر نکرد زیرا حسابی انتخاب نشده بود
no_limits_imposed: بدون محدودیت
not_subscribed: عضو نیست
- outbox_url: نشانی صندوق خروجی
pending: در انتظار بررسی
perform_full_suspension: تعلیق
- profile_url: نشانی نمایه
promote: ترفیعدادن
protocol: پروتکل
public: عمومی
@@ -174,7 +170,6 @@ fa:
moderator: ناظم
staff: کارمند
user: کاربر
- salmon_url: نشانی Salmon
search: جستجو
search_same_ip: دیگر کاربران با همان IP
shared_inbox_url: نشانی صندوق ورودی مشترک
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index 62cc5b36d..3ab1a590e 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -96,9 +96,7 @@ fi:
email_status: Sähköpostin tila
enable: Ota käyttöön
enabled: Käytössä
- feed_url: Syötteen osoite
followers: Seuraajat
- followers_url: Seuraajien osoite
follows: Seuraa
inbox_url: Saapuvan postilaatikon osoite
ip: IP
@@ -122,9 +120,7 @@ fi:
most_recent_activity: Viimeisin toiminta
most_recent_ip: Viimeisin IP
not_subscribed: Ei tilaaja
- outbox_url: Lähtevän postilaatikon osoite
perform_full_suspension: Siirrä kokonaan jäähylle
- profile_url: Profiilin osoite
promote: Ylennä
protocol: Protokolla
public: Julkinen
@@ -146,7 +142,6 @@ fi:
moderator: Moderaattori
staff: Henkilöstö
user: Käyttäjä
- salmon_url: Salmon-URL
search: Hae
shared_inbox_url: Jaetun saapuvan postilaatikon osoite
show:
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index 0991f2b39..0a1a86576 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -118,9 +118,7 @@ fr:
email_status: État du courriel
enable: Activer
enabled: Activé
- feed_url: URL du flux
followers: Abonné⋅e⋅s
- followers_url: URL des abonné·e·s
follows: Abonnements
header: Entête
inbox_url: URL d’entrée
@@ -148,10 +146,8 @@ fr:
no_account_selected: Aucun compte n’a été modifié, car aucun n’a été sélectionné
no_limits_imposed: Aucune limite imposée
not_subscribed: Non abonné
- outbox_url: URL de sortie
pending: En attente d’approbation
perform_full_suspension: Suspendre
- profile_url: URL du profil
promote: Promouvoir
protocol: Protocole
public: Publique
@@ -174,7 +170,6 @@ fr:
moderator: Modérateur
staff: Équipe
user: Utilisateur
- salmon_url: URL Salmon
search: Rechercher
search_same_ip: Autres utilisateur·rice·s avec la même IP
shared_inbox_url: URL de la boite de réception partagée
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index fbd953359..057b21566 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -118,9 +118,7 @@ gl:
email_status: Estado do correo
enable: Habilitar
enabled: Habilitado
- feed_url: URL fonte
followers: Seguidoras
- followers_url: URL das seguidoras
follows: Segue
header: Cabeceira
inbox_url: URL da Caixa de entrada
@@ -148,10 +146,8 @@ gl:
no_account_selected: Non cambiou nada xa que non tiña nada seleccionado
no_limits_imposed: Sen límites impostos
not_subscribed: Non suscrita
- outbox_url: URL caixa de saída
pending: Pendente revisión
perform_full_suspension: Suspender
- profile_url: URL do perfil
promote: Promocionar
protocol: Protocolo
public: Público
@@ -174,7 +170,6 @@ gl:
moderator: Moderador
staff: Membresía
user: Usuaria
- salmon_url: URL Salmon
search: Busca
search_same_ip: Outros usuarios co mesmo IP
shared_inbox_url: URL da caixa de entrada compartida
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 50db571dc..89e8a6e4f 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -52,9 +52,7 @@ he:
email_status: סטטוס דוא"ל
enable: לאפשר
enabled: מאופשר
- feed_url: כתובת פיד
followers: עוקבים
- followers_url: כתובת עוקבים
follows: נעקבים
inbox_url: כתובת תיבה נכנסת
ip: כתובת IP
@@ -75,9 +73,7 @@ he:
most_recent_activity: פעילות עדכנית
most_recent_ip: כתובות אחרונות
not_subscribed: לא רשום
- outbox_url: כתובת תיבת דואר יוצא
perform_full_suspension: ביצוע השעייה מלאה
- profile_url: כתובת פרופיל
promote: להעלות בדרגה
protocol: פרטיכל
public: פומבי
@@ -95,7 +91,6 @@ he:
admin: מנהל מערכת
moderator: מנחה דיונים
user: משתמש(ת)
- salmon_url: כתובת סלמון
search: חיפוש
shared_inbox_url: תיבה משותפת לדואר נכנס
show:
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index 7f5cd3d51..b4f8a970a 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -120,9 +120,7 @@ hu:
email_status: E-mail állapot
enable: Bekapcsolás
enabled: Bekapcsolva
- feed_url: Hírcsatorna URL
followers: Követő
- followers_url: Követő URL
follows: Követett
header: Fejléc
inbox_url: Beérkezett üzenetek URL
@@ -150,10 +148,8 @@ hu:
no_account_selected: Nem változott meg egy fiók sem, mert semmi sem volt kiválasztva
no_limits_imposed: Nincs korlátozás
not_subscribed: Nincs feliratkozás
- outbox_url: Kimenő üzenetek URL
pending: Engedélyezés alatt
perform_full_suspension: Felfüggesztés
- profile_url: Profil URL
promote: Előléptetés
protocol: Protokoll
public: Nyilvános
@@ -176,7 +172,6 @@ hu:
moderator: Moderátor
staff: Stáb
user: Felhasználó
- salmon_url: Salmon URL
search: Keresés
search_same_ip: Más felhasználók ugyanezzel az IP-vel
shared_inbox_url: Megosztott bejövő üzenetek URL
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 1a58b1c54..982e4289a 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -114,9 +114,7 @@ id:
email_status: Status Email
enable: Aktifkan
enabled: Diaktifkan
- feed_url: URL Feed
followers: Pengikut
- followers_url: URL pengikut
follows: Mengikut
header: Tajuk
inbox_url: URL Kotak masuk
@@ -144,10 +142,8 @@ id:
no_account_selected: Tak ada akun yang diubah sebab tak ada yang dipilih
no_limits_imposed: Tidak ada batasan
not_subscribed: Tidak berlangganan
- outbox_url: URL Kotak keluar
pending: Tinjauan tertunda
perform_full_suspension: Lakukan suspen penuh
- profile_url: URL profil
promote: Promosikan
protocol: Protokol
public: Publik
@@ -170,7 +166,6 @@ id:
moderator: Moderator
staff: Staf
user: Pengguna
- salmon_url: URL Salmon
search: Cari
search_same_ip: Pengguna lain dengan IP yang sama
shared_inbox_url: URL kotak masuk bersama
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 987321313..aadf0f3d6 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -118,9 +118,7 @@ it:
email_status: Stato email
enable: Abilita
enabled: Abilitato
- feed_url: URL Feed
followers: Follower
- followers_url: URL follower
follows: Segue
header: Intestazione
inbox_url: URL inbox
@@ -148,10 +146,8 @@ it:
no_account_selected: Nessun account è stato modificato visto che non ne è stato selezionato nessuno
no_limits_imposed: Nessun limite imposto
not_subscribed: Non sottoscritto
- outbox_url: URL outbox
pending: Revisioni in attesa
perform_full_suspension: Sospendi
- profile_url: URL profilo
promote: Promuovi
protocol: Protocollo
public: Pubblico
@@ -174,7 +170,6 @@ it:
moderator: Moderatore
staff: Personale
user: Utente
- salmon_url: URL Salmone
search: Cerca
search_same_ip: Altri utenti con lo stesso IP
shared_inbox_url: URL Inbox Condiviso
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 477fb2e3c..0dc77b775 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -114,9 +114,7 @@ ja:
email_status: メールアドレスの状態
enable: 有効化
enabled: 有効
- feed_url: フィードURL
followers: フォロワー数
- followers_url: Followers URL
follows: フォロー数
header: ヘッダー
inbox_url: Inbox URL
@@ -144,10 +142,8 @@ ja:
no_account_selected: 何も選択されていないため、変更されていません
no_limits_imposed: 制限なし
not_subscribed: 購読していない
- outbox_url: Outbox URL
pending: 承認待ち
perform_full_suspension: 活動を完全に停止させる
- profile_url: プロフィールURL
promote: 昇格
protocol: プロトコル
public: パブリック
@@ -170,7 +166,6 @@ ja:
moderator: モデレーター
staff: スタッフ
user: ユーザー
- salmon_url: Salmon URL
search: 検索
search_same_ip: 同じ IP のユーザーを検索
shared_inbox_url: Shared inbox URL
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 094a1a1a8..125912892 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -70,9 +70,7 @@ ka:
email_status: ელ-ფოსტის სტატუსი
enable: ჩართვა
enabled: ჩართულია
- feed_url: ლენტის ურლ
followers: მიმდევრები
- followers_url: მიმდევრების ურლ
follows: დადევნებები
inbox_url: ინბოქსის ურლ
ip: აი-პი
@@ -93,9 +91,7 @@ ka:
most_recent_activity: უახლესი აქტივობა
most_recent_ip: უახლესი აი-პი
not_subscribed: გამოუწერელი
- outbox_url: აუთბოქსის ურლ
perform_full_suspension: მოახდინეთ სრული შეჩერება
- profile_url: პროფილის ურლ
promote: დაწინაურება
protocol: პროტოკოლი
public: საჯარო
@@ -115,7 +111,6 @@ ka:
moderator: მოდერატორი
staff: სტაფი
user: მომხმარებელი
- salmon_url: სალმონის ურლ
search: ძებნა
shared_inbox_url: გაზიარებული ინბოქსის ურლ
show:
diff --git a/config/locales/kk.yml b/config/locales/kk.yml
index b48d6dd27..df2a29dab 100644
--- a/config/locales/kk.yml
+++ b/config/locales/kk.yml
@@ -118,9 +118,7 @@ kk:
email_status: Email статусы
enable: Қосу
enabled: Қосылды
- feed_url: Feеd URL
followers: Оқырмандар
- followers_url: Оқырмандар URL
follows: Жазылғандары
header: Басы
inbox_url: Келген хаттар URL
@@ -148,10 +146,8 @@ kk:
no_account_selected: Бірде-бір аккаунт өзгерген жоқ, себебі ештеңе таңдалмады
no_limits_imposed: Шектеу жоқ
not_subscribed: Жазылмаған
- outbox_url: Кеткен хаттар URL
pending: Күтудегілерді қарау
perform_full_suspension: Тоқтат
- profile_url: Профиль URL
promote: Жарнамалау
protocol: Хаттама
public: Ашық
@@ -174,7 +170,6 @@ kk:
moderator: Модератор
staff: Қызметкерлер
user: Қолданушы
- salmon_url: Ақсерке URL
search: Іздеу
search_same_ip: Осы ІРмен кірген басқа қолданушылар
shared_inbox_url: Бөлісілген инбокс URL
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index 8b1c76ee0..ee9e0e954 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -114,9 +114,7 @@ ko:
email_status: 이메일 상태
enable: 활성화
enabled: 활성
- feed_url: 피드 URL
followers: 팔로워 수
- followers_url: 팔로워 URL
follows: 팔로잉 수
header: 헤더
inbox_url: 수신함 URL
@@ -144,10 +142,8 @@ ko:
no_account_selected: 아무 계정도 선택 되지 않아 아무 것도 변경 되지 않았습니다
no_limits_imposed: 제한 없음
not_subscribed: 구독하지 않음
- outbox_url: 발신함 URL
pending: 심사 대기
perform_full_suspension: 정지시키기
- profile_url: 프로필 URL
promote: 승급
protocol: 프로토콜
public: 전체 공개
@@ -170,7 +166,6 @@ ko:
moderator: 모더레이터
staff: 스태프
user: 사용자
- salmon_url: Salmon URL
search: 검색
search_same_ip: 같은 IP의 다른 사용자들
shared_inbox_url: 공유된 inbox URL
diff --git a/config/locales/lt.yml b/config/locales/lt.yml
index 66fe07de1..e9634b397 100644
--- a/config/locales/lt.yml
+++ b/config/locales/lt.yml
@@ -75,9 +75,7 @@ lt:
email_status: El pašto statusas
enable: Įjungti
enabled: Įjungta
- feed_url: Srauto URL
followers: Sekėjai
- followers_url: Sekėjų URL
follows: Seka
header: Antraštė
inbox_url: Gautųjų URL
@@ -102,9 +100,7 @@ lt:
most_recent_ip: Paskutinis IP
no_limits_imposed: Be limitu
not_subscribed: Ne prenumeruota
- outbox_url: Išsiustųjų URL
perform_full_suspension: Užrakinti
- profile_url: Profilio URL
promote: Paaukštinti
protocol: Protokolas
public: Viešas
@@ -125,7 +121,6 @@ lt:
moderator: Moderatorius
staff: Personalas
user: Vartotojas
- salmon_url: Lašišos URL
search: Ieškoti
shared_inbox_url: Bendroji gautųjų URL
show:
diff --git a/config/locales/ms.yml b/config/locales/ms.yml
index c1fe7d15a..71dc72d9d 100644
--- a/config/locales/ms.yml
+++ b/config/locales/ms.yml
@@ -73,9 +73,7 @@ ms:
email_status: Status Emel
enable: Bolehkan
enabled: Dibolehkan
- feed_url: Suapan URL
followers: Pengikut
- followers_url: URL Pengikut
follows: Mengikuti
inbox_url: URL mesej masuk
ip: Alamat IP
@@ -97,9 +95,7 @@ ms:
most_recent_ip: IP terbaru
no_limits_imposed: Tiada had dikuatkuasakan
not_subscribed: Tiada langganan
- outbox_url: URL mesej keluar
perform_full_suspension: Gantung
- profile_url: URL profil
promote: Naikkan pangkat
protocol: Protokol
public: Awam
@@ -119,7 +115,6 @@ ms:
moderator: Pengawal
staff: Kakitangan
user: Pengguna
- salmon_url: URL Salmon
search: Cari
shared_inbox_url: URL Peti Masuk Berkongsi
show:
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index 8f2b77f2f..2b49708e3 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -118,9 +118,7 @@ nl:
email_status: E-mailstatus
enable: Inschakelen
enabled: Ingeschakeld
- feed_url: Feed-URL
followers: Volgers
- followers_url: Volgers-URL
follows: Volgt
header: Omslagfoto
inbox_url: Inbox-URL
@@ -148,10 +146,8 @@ nl:
no_account_selected: Er zijn geen accounts veranderd, omdat er geen een was geselecteerd
no_limits_imposed: Geen limieten ingesteld
not_subscribed: Niet geabonneerd
- outbox_url: Outbox-URL
pending: Moet nog beoordeeld worden
perform_full_suspension: Opschorten
- profile_url: Profiel-URL
promote: Promoveren
protocol: Protocol
public: Openbaar
@@ -174,7 +170,6 @@ nl:
moderator: Moderator
staff: Medewerkers
user: Gebruiker
- salmon_url: Salmon-URL
search: Zoeken
search_same_ip: Andere gebruikers met hetzelfde IP-adres
shared_inbox_url: Gedeelde inbox-URL
diff --git a/config/locales/no.yml b/config/locales/no.yml
index fa40975a7..2c8786066 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -48,9 +48,7 @@
email_status: E-poststatus
enable: Aktiver
enabled: Aktivert
- feed_url: Feed-URL
followers: Følgere
- followers_url: Følgere URL
follows: Følginger
inbox_url: Innboks URL
ip: IP-adresse
@@ -71,9 +69,7 @@
most_recent_activity: Nyligste aktivitet
most_recent_ip: Nyligste IP
not_subscribed: Ikke abonnért
- outbox_url: Utboks URL
perform_full_suspension: Utfør full utvisning
- profile_url: Profil-URL
promote: Oppgradere
protocol: Protokoll
public: Offentlig
@@ -90,7 +86,6 @@
roles:
staff: Personale
user: Bruker
- salmon_url: Salmon-URL
search: Søk
shared_inbox_url: Delt Innboks URL
show:
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index a82adf380..f84fe882a 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -108,9 +108,7 @@ oc:
email_status: Estat de l’adreça
enable: Activar
enabled: Activat
- feed_url: Flux URL
followers: Seguidors
- followers_url: URL dels seguidors
follows: Abonaments
header: Bandièra
inbox_url: URL de recepcion
@@ -138,10 +136,8 @@ oc:
no_account_selected: Cap de compte pas cambiat estant que cap èra pas seleccionat
no_limits_imposed: Cap de limit impausat
not_subscribed: Pas seguidor
- outbox_url: URL Outbox
pending: Revision en espèra
perform_full_suspension: Suspendre
- profile_url: URL del perfil
promote: Promòure
protocol: Protocòl
public: Public
@@ -164,7 +160,6 @@ oc:
moderator: Moderador
staff: Personnal
user: Uitlizaire
- salmon_url: URL Salmon
search: Cercar
shared_inbox_url: URL de recepcion partejada
show:
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 4d6181de3..8d80ac3a3 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -125,9 +125,7 @@ pl:
email_status: Stan e-maila
enable: Aktywuj
enabled: Aktywowano
- feed_url: Adres kanału
followers: Śledzący
- followers_url: Adres śledzących
follows: Śledzeni
header: Nagłówek
inbox_url: Adres skrzynki
@@ -155,10 +153,8 @@ pl:
no_account_selected: Żadne konto nie zostało zmienione, bo żadne nie zostało wybrane
no_limits_imposed: Nie nałożono ograniczeń
not_subscribed: Nie zasubskrybowano
- outbox_url: Adres skrzynki nadawczej
pending: Oczekuje na przegląd
perform_full_suspension: Zawieś
- profile_url: Adres profilu
promote: Podnieś uprawnienia
protocol: Protokół
public: Publiczne
@@ -181,7 +177,6 @@ pl:
moderator: Moderator
staff: Ekipa
user: Użytkownik
- salmon_url: Adres Salmon
search: Szukaj
shared_inbox_url: Adres udostępnianej skrzynki
show:
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index e653de469..84eff7991 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -107,9 +107,7 @@ pt-BR:
email_status: Estado do e-mail
enable: Ativar
enabled: Ativado
- feed_url: URL do feed
followers: Seguidores
- followers_url: URL de seguidores
follows: Segue
header: Cabeçalho
inbox_url: URL da caixa de entrada
@@ -137,10 +135,8 @@ pt-BR:
no_account_selected: Nenhuma conta foi modificada, pois nenhuma conta foi selecionada
no_limits_imposed: Nenhum limite imposto
not_subscribed: Não está inscrito
- outbox_url: URL da caixa de saída
pending: Esperando revisão
perform_full_suspension: Suspender
- profile_url: URL do perfil
promote: Promover
protocol: Protocolo
public: Público
@@ -163,7 +159,6 @@ pt-BR:
moderator: Moderador
staff: Equipe
user: Usuário
- salmon_url: URL Salmon
search: Pesquisar
shared_inbox_url: URL da caixa de entrada compartilhada
show:
diff --git a/config/locales/pt-PT.yml b/config/locales/pt-PT.yml
index 836d2a3e7..3c5b1ca9a 100644
--- a/config/locales/pt-PT.yml
+++ b/config/locales/pt-PT.yml
@@ -106,9 +106,7 @@ pt-PT:
email_status: Estado do correio electrónico
enable: Ativar
enabled: Ativado
- feed_url: URL do Feed
followers: Seguidores
- followers_url: URL dos seguidores
follows: A seguir
header: Cabeçalho
inbox_url: URL da caixa de entrada
@@ -132,9 +130,7 @@ pt-PT:
most_recent_ip: IP mais recente
no_limits_imposed: Sem limites impostos
not_subscribed: Não inscrito
- outbox_url: URL da caixa de saída
perform_full_suspension: Fazer suspensão completa
- profile_url: URL do perfil
promote: Promover
protocol: Protocolo
public: Público
@@ -155,7 +151,6 @@ pt-PT:
moderator: Moderador
staff: Equipa
user: Utilizador
- salmon_url: URL Salmon
search: Pesquisar
shared_inbox_url: URL da caixa de entrada compartilhada
show:
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index fbf8ebc12..5c68ce4d4 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -126,9 +126,7 @@ ru:
email_status: Статус e-mail
enable: Включить
enabled: Включен
- feed_url: URL фида
followers: Подписчики
- followers_url: URL подписчиков
follows: Подписки
header: Шапка
inbox_url: URL входящих
@@ -156,10 +154,8 @@ ru:
no_account_selected: Ничего не выбрано, никакие учётные записи не изменены
no_limits_imposed: Без ограничений
not_subscribed: Не подписаны
- outbox_url: URL исходящих
pending: Ожидает рассмотрения
perform_full_suspension: Полная блокировка
- profile_url: URL профиля
promote: Повысить
protocol: Протокол
public: Публичный
@@ -182,7 +178,6 @@ ru:
moderator: Модератор
staff: Персонал
user: Пользователь
- salmon_url: Страница Salmon
search: Поиск
search_same_ip: Другие пользователи с таким же IP
shared_inbox_url: URL общих входящих
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 4d86cf602..8339309b3 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -122,9 +122,7 @@ sk:
email_status: Stav emailu
enable: Povoľ
enabled: Povolený
- feed_url: adresa časovej osi
followers: Sledujúci
- followers_url: URL adresa sledujúcich
follows: Sledovania
header: Záhlavie
inbox_url: URL adresa prijatých správ
@@ -152,10 +150,8 @@ sk:
no_account_selected: Nedošlo k žiadnému pozmeneniu účtov, keďže žiadne neboli vybrané
no_limits_imposed: Nie sú stanovené žiadné obmedzenia
not_subscribed: Neodoberá
- outbox_url: URL poslaných
pending: Vyžaduje posúdenie
perform_full_suspension: Vylúč
- profile_url: URL adresa profilu
promote: Vyzdvihni
protocol: Protokol
public: Verejná časová os
@@ -178,7 +174,6 @@ sk:
moderator: Moderátor
staff: Člen
user: Užívateľ
- salmon_url: Salmon adresa
search: Hľadaj
search_same_ip: Ostatní užívatelia s rovnakou IP adresou
shared_inbox_url: URL zdieľanej schránky
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index da4c48d4a..2faaa149a 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -114,9 +114,7 @@ sl:
email_status: Stanje e-pošte
enable: Omogoči
enabled: Omogočeno
- feed_url: URL vira
followers: Sledilci
- followers_url: URL sledilcev
follows: Sledi
header: Glava
inbox_url: URL mape "Prejeto"
@@ -144,10 +142,8 @@ sl:
no_account_selected: Noben račun ni bil spremenjen, ker ni bil izbran noben
no_limits_imposed: Brez omejitev
not_subscribed: Ni naročen
- outbox_url: URL za pošiljanje
pending: Čakanje na pregled
perform_full_suspension: Suspendiraj
- profile_url: URL profila
promote: Promoviraj
protocol: Protokol
public: Javen
@@ -170,7 +166,6 @@ sl:
moderator: Moderator
staff: Osebje
user: Uporabnik
- salmon_url: URL lososa
search: Iskanje
shared_inbox_url: URL mape "Prejeto v skupni rabi"
show:
diff --git a/config/locales/sq.yml b/config/locales/sq.yml
index c64fe23c6..e5378082e 100644
--- a/config/locales/sq.yml
+++ b/config/locales/sq.yml
@@ -81,9 +81,7 @@ sq:
email_status: Gjendje email-i
enable: Aktivizoje
enabled: E aktivizuar
- feed_url: URL prurjeje
followers: Ndjekës
- followers_url: URL Ndjekësish
follows: Ndjekje
header: Krye
inbox_url: URL Mesazhesh të Marrë
@@ -108,9 +106,7 @@ sq:
most_recent_ip: IP-ja më e freskët
no_limits_imposed: Pa imponim kufijsh
not_subscribed: Jo i pajtuar
- outbox_url: URL Mesazhesh të Dërguar
perform_full_suspension: Pezulloje
- profile_url: URL profili
promote: Promovojeni
protocol: Protokoll
public: Publike
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 2bddaf311..1f3d69e21 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -47,9 +47,7 @@ sr-Latn:
email_status: Status e-pošte
enable: Uključi
enabled: Uključeno
- feed_url: Adresa dovoda
followers: Pratioci
- followers_url: Adresa pratioca
follows: Praćeni
inbox_url: Adresa sandučeta
location:
@@ -69,9 +67,7 @@ sr-Latn:
most_recent_activity: Najskorija aktivnost
most_recent_ip: Najskorija IP adresa
not_subscribed: Nije pretplaćen
- outbox_url: Odlazno sanduče
perform_full_suspension: Izvrši kompletno isključenje
- profile_url: Adresa profila
promote: Unapredi
protocol: Protokol
public: Javno
@@ -87,7 +83,6 @@ sr-Latn:
roles:
staff: Osoblje
user: Korisnik
- salmon_url: Salmon adresa
search: Pretraga
shared_inbox_url: Adresa deljenog sandučeta
show:
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 21eb19fee..d06bb214e 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -91,9 +91,7 @@ sr:
email_status: Статус е-поште
enable: Омогући
enabled: Укључено
- feed_url: Адреса довода
followers: Пратиоци
- followers_url: Адреса пратиоца
follows: Праћени
header: Заглавље
inbox_url: Адреса сандучета
@@ -118,9 +116,7 @@ sr:
most_recent_ip: Најскорија IP адреса
no_limits_imposed: Нема ограничења
not_subscribed: Није претплаћен
- outbox_url: Одлазно сандуче
perform_full_suspension: Искључи
- profile_url: Адреса профила
promote: Унапреди
protocol: Протокол
public: Јавно
@@ -141,7 +137,6 @@ sr:
moderator: Модератор
staff: Особље
user: Корисник
- salmon_url: Salmon адреса
search: Претрага
shared_inbox_url: Адреса дељеног сандучета
show:
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 19c7ef845..911698620 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -106,9 +106,7 @@ sv:
email_status: E-poststatus
enable: Aktivera
enabled: Aktiverad
- feed_url: Flödes URL
followers: Följare
- followers_url: Följare URL
follows: Följs
header: Rubrik
inbox_url: Inkorgs URL
@@ -136,10 +134,8 @@ sv:
no_account_selected: Inga konton har ändrats och inget har valts
no_limits_imposed: Inga begränsningar har införts
not_subscribed: Inte prenumererat
- outbox_url: Utkorg URL
pending: Inväntar granskning
perform_full_suspension: Utför full avstängning
- profile_url: Profil URL
promote: Befordra
protocol: Protokoll
public: Offentlig
@@ -162,7 +158,6 @@ sv:
moderator: Moderator
staff: Personal
user: Användare
- salmon_url: Lax URL
search: Sök
search_same_ip: Annan användare med samma IP-adress
shared_inbox_url: Delad inkorg URL
diff --git a/config/locales/te.yml b/config/locales/te.yml
index 526b03b49..dd6c878e7 100644
--- a/config/locales/te.yml
+++ b/config/locales/te.yml
@@ -87,9 +87,7 @@ te:
email_status: ఈమెయిల్ స్థితి
enable: చేతనం
enabled: చేతనం చేయబడింది
- feed_url: ఫీడ్ URL
followers: అనుచరులు
- followers_url: అనుచరుల URL
follows: అనుసరిస్తున్నారు
inbox_url: ఇన్ బాక్స్ URL
location:
diff --git a/config/locales/th.yml b/config/locales/th.yml
index eda9b52a2..214a93acf 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -97,9 +97,7 @@ th:
email_status: สถานะอีเมล
enable: เปิดใช้งาน
enabled: เปิดใช้งานอยู่
- feed_url: URL ฟีด
followers: ผู้ติดตาม
- followers_url: URL ผู้ติดตาม
follows: การติดตาม
header: ส่วนหัว
inbox_url: URL กล่องขาเข้า
@@ -124,9 +122,7 @@ th:
most_recent_activity: กิจกรรมล่าสุด
most_recent_ip: IP ล่าสุด
not_subscribed: ไม่ได้บอกรับ
- outbox_url: URL กล่องขาออก
perform_full_suspension: ระงับ
- profile_url: URL โปรไฟล์
promote: เลื่อนตำแหน่ง
protocol: โปรโตคอล
public: สาธารณะ
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index afaf4d251..f3a2817ec 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -118,9 +118,7 @@ tr:
email_status: E-posta durumu
enable: Etkinleştir
enabled: Etkin
- feed_url: Besleme linki
followers: Takipçiler
- followers_url: Takipçi bağlantısı
follows: Takip edilen
header: Üstbilgi
inbox_url: Gelen kutusu bağlantısı
@@ -148,10 +146,8 @@ tr:
no_account_selected: Hiçbiri seçilmediğinden hiçbir hesap değiştirilmedi
no_limits_imposed: Sınır koymaz
not_subscribed: Abone edilmedi
- outbox_url: Giden Kutusu URL'si
pending: Bekleyen yorum
perform_full_suspension: Askıya al
- profile_url: Profil linki
promote: Yükselt
protocol: Protokol
public: Herkese açık
@@ -174,7 +170,6 @@ tr:
moderator: Denetleyici
staff: Personel
user: Kullanıcı
- salmon_url: Salmon Linki
search: Ara
search_same_ip: Aynı IP adresine sahip diğer kullanıcılar
shared_inbox_url: Paylaşılan gelen kutusu bağlantısı
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index fce2366c7..edcc289da 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -120,9 +120,7 @@ uk:
email_status: Статус електронної пошти
enable: Увімкнути
enabled: Увімкнено
- feed_url: URL-адреса каналу
followers: Підписники
- followers_url: URL підписників
follows: Підписки
header: Заголовок
inbox_url: URL вхідних повідомлень
@@ -150,10 +148,8 @@ uk:
no_account_selected: Жоден обліковий запис не було змінено, оскільки жоден не було вибрано
no_limits_imposed: Жодних обмежень не накладено
not_subscribed: Не підписані
- outbox_url: URL вихідних повідомлень
pending: Відгук в очікуванні
perform_full_suspension: Призупинити
- profile_url: URL профілю
promote: Просунути
protocol: Протокол
public: Публічний
@@ -176,7 +172,6 @@ uk:
moderator: Модератор
staff: Персонал
user: Користувач
- salmon_url: Salmon URL
search: Пошук
shared_inbox_url: URL спільного вхідного кошика
show:
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index c7822d6e3..49dd31bac 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -107,9 +107,7 @@ zh-CN:
email_status: 电子邮件地址状态
enable: 启用
enabled: 已启用
- feed_url: 订阅 URL
followers: 关注者
- followers_url: 关注者(Followers)URL
follows: 正在关注
header: 个人资料页横幅图片
inbox_url: 收件箱(Inbox)URL
@@ -137,10 +135,8 @@ zh-CN:
no_account_selected: 因为没有账户被选择,所以没有更改
no_limits_imposed: 无限制
not_subscribed: 未订阅
- outbox_url: 发件箱(Outbox)URL
pending: 待审核
perform_full_suspension: 封禁
- profile_url: 个人资料页面 URL
promote: 升任
protocol: 协议
public: 公开页面
@@ -163,7 +159,6 @@ zh-CN:
moderator: 监察员
staff: 管理人员
user: 普通用户
- salmon_url: 三文鱼协议网址(Salmon URL)
search: 搜索
search_same_ip: 具有相同IP的其他用户
shared_inbox_url: 公用收件箱(Shared Inbox)URL
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 74eefcd05..4b7ca52e1 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -64,9 +64,7 @@ zh-HK:
email_status: 电子邮件状态
enable: 啟用
enabled: 已啟用
- feed_url: 訂閱 URL
followers: 關注者
- followers_url: 關注者(Followers)URL
follows: 正在關注
inbox_url: 收件箱(Inbox)URL
ip: IP 位域
@@ -87,9 +85,7 @@ zh-HK:
most_recent_activity: 最新活動
most_recent_ip: 最新 IP 位域
not_subscribed: 未訂閱
- outbox_url: 寄件箱(Outbox)URL
perform_full_suspension: 完全停權
- profile_url: 個人檔案 URL
promote: 升任
protocol: 協議
public: 公共
@@ -109,7 +105,6 @@ zh-HK:
moderator: 監察員
staff: 管理人員
user: 普通用戶
- salmon_url: Salmon 反饋 URL
search: 搜索
shared_inbox_url: 公共收件箱(Shared Inbox)URL
show:
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 1f0c5522f..7a5627c30 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -99,9 +99,7 @@ zh-TW:
email_status: 電子信箱狀態
enable: 啟用
enabled: 已啟用
- feed_url: 訂閱 URL
followers: 關注者
- followers_url: 關注者(Followers)URL
follows: 正在關注
header: 開頭
inbox_url: 收件箱 (Inbox) URL
@@ -128,10 +126,8 @@ zh-TW:
most_recent_ip: 最近 IP 位址
no_limits_imposed: 未受限制
not_subscribed: 未訂閱
- outbox_url: 寄件箱 (Outbox) URL
pending: 等待審核中
perform_full_suspension: 停權
- profile_url: 個人檔案 URL
promote: 晉級
protocol: 協議
public: 公開
@@ -154,7 +150,6 @@ zh-TW:
moderator: 版主
staff: 管理人員
user: 普通使用者
- salmon_url: Salmon 網址
search: 搜尋
shared_inbox_url: 共享收件箱網址
show:
diff --git a/config/settings.yml b/config/settings.yml
index 212f4eda8..7c22d6df0 100644
--- a/config/settings.yml
+++ b/config/settings.yml
@@ -62,6 +62,7 @@ defaults: &defaults
- mod
- moderator
disallowed_hashtags: # space separated string or list of hashtags without the hash
+ enable_bootstrap_timeline_accounts: true
bootstrap_timeline_accounts: ''
activity_api_enabled: true
peers_api_enabled: true
diff --git a/db/migrate/20191212003415_increase_backup_size.rb b/db/migrate/20191212003415_increase_backup_size.rb
new file mode 100644
index 000000000..a5192263c
--- /dev/null
+++ b/db/migrate/20191212003415_increase_backup_size.rb
@@ -0,0 +1,21 @@
+require Rails.root.join('lib', 'mastodon', 'migration_helpers')
+
+class IncreaseBackupSize < ActiveRecord::Migration[5.2]
+ include Mastodon::MigrationHelpers
+
+ disable_ddl_transaction!
+
+ def up
+ safety_assured do
+ change_column_type_concurrently :backups, :dump_file_size, :bigint
+ cleanup_concurrent_column_type_change :backups, :dump_file_size
+ end
+ end
+
+ def down
+ safety_assured do
+ change_column_type_concurrently :backups, :dump_file_size, :integer
+ cleanup_concurrent_column_type_change :backups, :dump_file_size
+ end
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 3fe20c212..d6f005ac0 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 2019_10_31_163205) do
+ActiveRecord::Schema.define(version: 2019_12_12_003415) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -200,11 +200,11 @@ ActiveRecord::Schema.define(version: 2019_10_31_163205) do
t.bigint "user_id"
t.string "dump_file_name"
t.string "dump_content_type"
- t.integer "dump_file_size"
t.datetime "dump_updated_at"
t.boolean "processed", default: false, null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
+ t.bigint "dump_file_size"
end
create_table "blocks", force: :cascade do |t|
diff --git a/docs/instant-messaging.md b/docs/instant-messaging.md
new file mode 100644
index 000000000..85b6425a3
--- /dev/null
+++ b/docs/instant-messaging.md
@@ -0,0 +1,42 @@
+# Instant messaging documentation - by Tykayn
+=========
+here is detailed the progress and the state of wondering.
+By now, **the IM (Instant messaging) aims to be a simple frontend over the direct message structure**.
+
+Come discuss here:
+[@tykayn](https://mastodon.cipherbliss.com/@tykayn)
+or here
+[contact@cipherbliss.com](mailto:contact@cipherbliss.com)
+
+## what is done
+The IM is able to
+* list followed accounts by the user
+ * retrieving contacts from the DB
+* talk one to one with an account
+ * the input is a simplified compose form, it has predefined settings to have only one recipient. It uses the same mecanism than the compose form to send a private / direct message to somebody. other mentions of persons are not yet recognised.
+* components used by the IM are listed under the folder `app/javascript/mastodon/features/ui/components/messaging`
+
+* the addition of bulma CSS enables a reliable set of css classes to have a cool layout and tooling.
+* style dedicated to the IM is added in the mastodon style folder
+`app/javascript/styles/mastodon/messaging/main.scss`
+
+
+# TODO
+## Work in progress
+* retrieve contacts, just like in http://localhost:3000/web/accounts/1/following
+* open a new conversation when we click on an account in the contact list
+
+## Research
+find how it is already done to:
+
+
+* retrieve a conversation like http://localhost:3000/web/statuses/103356660630283894
+* subscribe to the new messages of a conversation
+* send a direct message
+* display a page with the routing system
+
+## Paths to explore, reflexions
+I would like ideally the IM to be able to:
+* send pictures just like in normal messages
+* be end to end encrypted
+* be able to be a bridge with some other messaging, like Matrix does with IRC and a lot of other.
diff --git a/lib/mastodon/statuses_cli.rb b/lib/mastodon/statuses_cli.rb
index 4d9af0a54..74f15de5f 100644
--- a/lib/mastodon/statuses_cli.rb
+++ b/lib/mastodon/statuses_cli.rb
@@ -13,6 +13,7 @@ module Mastodon
end
option :days, type: :numeric, default: 90
+ option :clean_followed, type: :boolean
desc 'remove', 'Remove unreferenced statuses'
long_desc <<~LONG_DESC
Remove statuses that are not referenced by local user activity, such as
@@ -34,17 +35,26 @@ module Mastodon
say('Beginning removal... This might take a while...')
- Status.remote
- .where('id < ?', max_id)
- .where(reblog_of_id: nil) # Skip reblogs
- .where(in_reply_to_id: nil) # Skip replies
- .where('id NOT IN (SELECT status_pins.status_id FROM status_pins WHERE statuses.id = status_id)') # Skip statuses that are pinned on profiles
- .where('id NOT IN (SELECT mentions.status_id FROM mentions WHERE statuses.id = mentions.status_id AND mentions.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))') # Skip statuses that mention local accounts
- .where('id NOT IN (SELECT statuses1.in_reply_to_id FROM statuses AS statuses1 WHERE statuses.id = statuses1.in_reply_to_id)') # Skip statuses favourited by local accounts
- .where('id NOT IN (SELECT statuses1.reblog_of_id FROM statuses AS statuses1 WHERE statuses.id = statuses1.reblog_of_id AND statuses1.account_id IN (SELECT accounts.id FROM accounts WHERE accounts.domain IS NULL))') # Skip statuses reblogged by local accounts
- .where('account_id NOT IN (SELECT follows.target_account_id FROM follows WHERE statuses.account_id = follows.target_account_id)') # Skip accounts followed by local accounts
- .in_batches
- .delete_all
+ scope = Status.remote.where('id < ?', max_id)
+ # Skip reblogs of local statuses
+ scope = scope.where('reblog_of_id NOT IN (SELECT statuses1.id FROM statuses AS statuses1 WHERE statuses1.id = statuses.reblog_of_id AND (statuses1.uri IS NULL OR statuses1.local))')
+ # Skip statuses that are pinned on profiles
+ scope = scope.where('id NOT IN (SELECT status_pins.status_id FROM status_pins WHERE statuses.id = status_id)')
+ # Skip statuses that mention local accounts
+ scope = scope.where('id NOT IN (SELECT mentions.status_id FROM mentions WHERE statuses.id = mentions.status_id AND mentions.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))')
+ # Skip statuses which have replies
+ scope = scope.where('id NOT IN (SELECT statuses1.in_reply_to_id FROM statuses AS statuses1 WHERE statuses.id = statuses1.in_reply_to_id)')
+ # Skip statuses reblogged by local accounts or with recent boosts
+ scope = scope.where('id NOT IN (SELECT statuses1.reblog_of_id FROM statuses AS statuses1 WHERE statuses.id = statuses1.reblog_of_id AND (statuses1.uri IS NULL OR statuses1.local OR statuses1.id >= ?))', max_id)
+ # Skip statuses favourited by local users
+ scope = scope.where('id NOT IN (SELECT favourites.status_id FROM favourites WHERE statuses.id = favourites.status_id AND favourites.account_id IN (SELECT accounts.id FROM accounts WHERE domain IS NULL))')
+
+ unless options[:clean_followed]
+ # Skip accounts followed by local accounts
+ scope = scope.where('account_id NOT IN (SELECT follows.target_account_id FROM follows WHERE statuses.account_id = follows.target_account_id)')
+ end
+
+ scope.in_batches.delete_all
say('Beginning removal of now-orphaned media attachments to free up disk space...')
diff --git a/package.json b/package.json
index 083d78c2c..ef1931f0e 100644
--- a/package.json
+++ b/package.json
@@ -12,7 +12,7 @@
"start": "node ./streaming/index.js",
"test": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:jest",
"test:lint": "${npm_execpath} run test:lint:js && ${npm_execpath} run test:lint:sass",
- "test:lint:js": "eslint --ext=js .",
+ "test:lint:js": "eslint --ext=js . --cache",
"test:lint:sass": "sass-lint -v",
"test:jest": "cross-env NODE_ENV=test jest --coverage"
},
@@ -64,12 +64,12 @@
"@babel/plugin-proposal-decorators": "^7.7.4",
"@babel/plugin-transform-react-inline-elements": "^7.7.4",
"@babel/plugin-transform-runtime": "^7.7.6",
- "@babel/preset-env": "^7.7.4",
+ "@babel/preset-env": "^7.7.6",
"@babel/preset-react": "^7.7.4",
"@babel/runtime": "^7.7.6",
"@clusterws/cws": "^0.16.0",
"@gamestdio/websocket": "^0.3.2",
- "array-includes": "^3.0.3",
+ "array-includes": "^3.1.0",
"arrow-key-navigation": "^1.1.0",
"autoprefixer": "^9.7.3",
"axios": "^0.19.0",
@@ -80,11 +80,12 @@
"babel-plugin-transform-react-remove-prop-types": "^0.4.24",
"babel-runtime": "^6.26.0",
"blurhash": "^1.1.3",
+ "bulma": "^0.8.0",
"classnames": "^2.2.5",
- "compression-webpack-plugin": "^3.0.0",
- "copy-webpack-plugin": "^5.0.5",
+ "compression-webpack-plugin": "^3.0.1",
+ "copy-webpack-plugin": "^5.1.1",
"cross-env": "^6.0.3",
- "css-loader": "^3.2.0",
+ "css-loader": "^3.3.2",
"cssnano": "^4.1.10",
"detect-passive-events": "^1.0.2",
"dotenv": "^8.2.0",
@@ -137,7 +138,7 @@
"react-motion": "^0.5.2",
"react-notification": "^6.8.5",
"react-overlays": "^0.9.1",
- "react-redux": "^7.1.1",
+ "react-redux": "^7.1.3",
"react-redux-loading-bar": "^4.0.8",
"react-router-dom": "^4.1.1",
"react-router-scroll-4": "^1.0.0-beta.1",
@@ -177,7 +178,7 @@
"enzyme": "^3.10.0",
"enzyme-adapter-react-16": "^1.15.1",
"eslint": "^6.7.2",
- "eslint-plugin-import": "~2.19.0",
+ "eslint-plugin-import": "~2.19.1",
"eslint-plugin-jsx-a11y": "~6.2.3",
"eslint-plugin-promise": "~4.2.1",
"eslint-plugin-react": "~7.17.0",
diff --git a/spec/controllers/settings/featured_tags_controller_spec.rb b/spec/controllers/settings/featured_tags_controller_spec.rb
new file mode 100644
index 000000000..33b87f9f6
--- /dev/null
+++ b/spec/controllers/settings/featured_tags_controller_spec.rb
@@ -0,0 +1,43 @@
+require 'rails_helper'
+
+describe Settings::FeaturedTagsController do
+ render_views
+
+ shared_examples 'authenticate user' do
+ it 'redirects to sign_in page' do
+ is_expected.to redirect_to new_user_session_path
+ end
+ end
+
+ describe 'POST #create' do
+ context 'when user is not sign in' do
+ subject { post :create }
+
+ it_behaves_like 'authenticate user'
+ end
+
+ context 'when user is sign in' do
+ subject { post :create, params: { featured_tag: params } }
+
+ let(:user) { Fabricate(:user, password: '12345678') }
+
+ before { sign_in user, scope: :user }
+
+ context 'when parameter is valid' do
+ let(:params) { { name: 'test' } }
+
+ it 'creates featured tag' do
+ expect { subject }.to change { user.account.featured_tags.count }.by(1)
+ end
+ end
+
+ context 'when parameter is invalid' do
+ let(:params) { { name: 'test, #foo !bleh' } }
+
+ it 'renders new' do
+ expect(subject).to render_template :index
+ end
+ end
+ end
+ end
+end
diff --git a/spec/features/log_in_spec.rb b/spec/features/log_in_spec.rb
index f6c26cd0f..b874c255b 100644
--- a/spec/features/log_in_spec.rb
+++ b/spec/features/log_in_spec.rb
@@ -1,7 +1,7 @@
require "rails_helper"
feature "Log in" do
- given(:email) { "test@examle.com" }
+ given(:email) { "test@example.com" }
given(:password) { "password" }
given(:confirmed_at) { Time.zone.now }
diff --git a/spec/lib/activitypub/activity/create_spec.rb b/spec/lib/activitypub/activity/create_spec.rb
index b709954a3..c4efb5cc9 100644
--- a/spec/lib/activitypub/activity/create_spec.rb
+++ b/spec/lib/activitypub/activity/create_spec.rb
@@ -378,6 +378,28 @@ RSpec.describe ActivityPub::Activity::Create do
end
end
+ context 'with hashtags invalid name' do
+ let(:object_json) do
+ {
+ id: [ActivityPub::TagManager.instance.uri_for(sender), '#bar'].join,
+ type: 'Note',
+ content: 'Lorem ipsum',
+ tag: [
+ {
+ type: 'Hashtag',
+ href: 'http://example.com/blah',
+ name: 'foo, #eh !',
+ },
+ ],
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+ expect(status).to_not be_nil
+ end
+ end
+
context 'with emojis' do
let(:object_json) do
{
diff --git a/spec/services/activitypub/fetch_remote_status_service_spec.rb b/spec/services/activitypub/fetch_remote_status_service_spec.rb
index 78dd59e3b..ff883de9d 100644
--- a/spec/services/activitypub/fetch_remote_status_service_spec.rb
+++ b/spec/services/activitypub/fetch_remote_status_service_spec.rb
@@ -1,4 +1,4 @@
-require 'rails_helper'
+temprequire 'rails_helper'
RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
include ActionView::Helpers::TextHelper
@@ -104,6 +104,26 @@ RSpec.describe ActivityPub::FetchRemoteStatusService, type: :service do
end
end
+ context 'with Event object' do
+ let(:object) do
+ {
+ '@context': 'https://www.w3.org/ns/activitystreams',
+ id: "https://#{valid_domain}/@foo/1234",
+ type: 'Event',
+ name: "Let's change the world",
+ attributedTo: ActivityPub::TagManager.instance.uri_for(sender)
+ }
+ end
+
+ it 'creates status' do
+ status = sender.statuses.first
+
+ expect(status).to_not be_nil
+ expect(status.url).to eq "https://#{valid_domain}/@foo/1234"
+ expect(strip_tags(status.text)).to eq "Let's change the world https://#{valid_domain}/@foo/1234"
+ end
+ end
+
context 'with wrong id' do
let(:note) do
{
diff --git a/spec/services/fetch_remote_account_service_spec.rb b/spec/services/fetch_remote_account_service_spec.rb
deleted file mode 100644
index ee7325be2..000000000
--- a/spec/services/fetch_remote_account_service_spec.rb
+++ /dev/null
@@ -1,50 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe FetchRemoteAccountService, type: :service do
- let(:url) { 'https://example.com/alice' }
- let(:prefetched_body) { nil }
- let(:protocol) { :ostatus }
-
- subject { FetchRemoteAccountService.new.call(url, prefetched_body, protocol) }
-
- let(:actor) do
- {
- '@context': 'https://www.w3.org/ns/activitystreams',
- id: 'https://example.com/alice',
- type: 'Person',
- preferredUsername: 'alice',
- name: 'Alice',
- summary: 'Foo bar',
- inbox: 'http://example.com/alice/inbox',
- }
- end
-
- let(:webfinger) { { subject: 'acct:alice@example.com', links: [{ rel: 'self', href: 'https://example.com/alice' }] } }
- let(:xml) { File.read(Rails.root.join('spec', 'fixtures', 'xml', 'mastodon.atom')) }
-
- shared_examples 'return Account' do
- it { is_expected.to be_an Account }
- end
-
- context 'protocol is :activitypub' do
- let(:prefetched_body) { Oj.dump(actor) }
- let(:protocol) { :activitypub }
-
- before do
- stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
- end
-
- include_examples 'return Account'
- end
-
- context 'when prefetched_body is nil' do
- context 'protocol is :activitypub' do
- before do
- stub_request(:get, url).to_return(status: 200, body: Oj.dump(actor), headers: { 'Content-Type' => 'application/activity+json' })
- stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
- end
-
- include_examples 'return Account'
- end
- end
-end
diff --git a/spec/services/fetch_remote_status_service_spec.rb b/spec/services/fetch_remote_status_service_spec.rb
index f9db024b9..1c4b4fee2 100644
--- a/spec/services/fetch_remote_status_service_spec.rb
+++ b/spec/services/fetch_remote_status_service_spec.rb
@@ -16,9 +16,8 @@ RSpec.describe FetchRemoteStatusService, type: :service do
end
context 'protocol is :activitypub' do
- subject { described_class.new.call(note[:id], prefetched_body, protocol) }
+ subject { described_class.new.call(note[:id], prefetched_body) }
let(:prefetched_body) { Oj.dump(note) }
- let(:protocol) { :activitypub }
before do
account.update(uri: ActivityPub::TagManager.instance.uri_for(account))
@@ -59,7 +58,7 @@ RSpec.describe FetchRemoteStatusService, type: :service do
XML
- expect(subject.call('https://fake.domain/foo', status_body, :ostatus)).to be_nil
+ expect(subject.call('https://fake.domain/foo', status_body)).to be_nil
end
it 'does not create status with wrong id when id uses http format' do
@@ -81,7 +80,7 @@ RSpec.describe FetchRemoteStatusService, type: :service do
XML
- expect(subject.call('https://real.domain/statuses/456', status_body, :ostatus)).to be_nil
+ expect(subject.call('https://real.domain/statuses/456', status_body)).to be_nil
end
end
end
diff --git a/spec/services/fetch_resource_service_spec.rb b/spec/services/fetch_resource_service_spec.rb
index f836147d3..3af6a0689 100644
--- a/spec/services/fetch_resource_service_spec.rb
+++ b/spec/services/fetch_resource_service_spec.rb
@@ -71,14 +71,14 @@ RSpec.describe FetchResourceService, type: :service do
let(:content_type) { 'application/activity+json; charset=utf-8' }
let(:body) { json }
- it { is_expected.to eq [1, { prefetched_body: body, id: true }, :activitypub] }
+ it { is_expected.to eq [1, { prefetched_body: body, id: true }] }
end
context 'when content type is ld+json with profile' do
let(:content_type) { 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"' }
let(:body) { json }
- it { is_expected.to eq [1, { prefetched_body: body, id: true }, :activitypub] }
+ it { is_expected.to eq [1, { prefetched_body: body, id: true }] }
end
before do
@@ -89,14 +89,14 @@ RSpec.describe FetchResourceService, type: :service do
context 'when link header is present' do
let(:headers) { { 'Link' => '; rel="alternate"; type="application/activity+json"', } }
- it { is_expected.to eq [1, { prefetched_body: json, id: true }, :activitypub] }
+ it { is_expected.to eq [1, { prefetched_body: json, id: true }] }
end
context 'when content type is text/html' do
let(:content_type) { 'text/html' }
let(:body) { '' }
- it { is_expected.to eq [1, { prefetched_body: json, id: true }, :activitypub] }
+ it { is_expected.to eq [1, { prefetched_body: json, id: true }] }
end
end
end
diff --git a/yarn.lock b/yarn.lock
index 8114a8b00..6b018ac97 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -157,6 +157,18 @@
"@babel/types" "^7.7.4"
lodash "^4.17.13"
+"@babel/helper-module-transforms@^7.7.5":
+ version "7.7.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.5.tgz#d044da7ffd91ec967db25cd6748f704b6b244835"
+ integrity sha512-A7pSxyJf1gN5qXVcidwLWydjftUN878VkalhXX5iQDuGyiGK3sOrrKKHF4/A4fwHtnsotv/NipwAeLzY4KQPvw==
+ dependencies:
+ "@babel/helper-module-imports" "^7.7.4"
+ "@babel/helper-simple-access" "^7.7.4"
+ "@babel/helper-split-export-declaration" "^7.7.4"
+ "@babel/template" "^7.7.4"
+ "@babel/types" "^7.7.4"
+ lodash "^4.17.13"
+
"@babel/helper-optimise-call-expression@^7.7.4":
version "7.7.4"
resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.4.tgz#034af31370d2995242aa4df402c3b7794b2dcdf2"
@@ -478,21 +490,21 @@
dependencies:
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/plugin-transform-modules-amd@^7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.4.tgz#276b3845ca2b228f2995e453adc2e6f54d72fb71"
- integrity sha512-/542/5LNA18YDtg1F+QHvvUSlxdvjZoD/aldQwkq+E3WCkbEjNSN9zdrOXaSlfg3IfGi22ijzecklF/A7kVZFQ==
+"@babel/plugin-transform-modules-amd@^7.7.5":
+ version "7.7.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.7.5.tgz#39e0fb717224b59475b306402bb8eedab01e729c"
+ integrity sha512-CT57FG4A2ZUNU1v+HdvDSDrjNWBrtCmSH6YbbgN3Lrf0Di/q/lWRxZrE72p3+HCCz9UjfZOEBdphgC0nzOS6DQ==
dependencies:
- "@babel/helper-module-transforms" "^7.7.4"
+ "@babel/helper-module-transforms" "^7.7.5"
"@babel/helper-plugin-utils" "^7.0.0"
babel-plugin-dynamic-import-node "^2.3.0"
-"@babel/plugin-transform-modules-commonjs@^7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.4.tgz#bee4386e550446343dd52a571eda47851ff857a3"
- integrity sha512-k8iVS7Jhc367IcNF53KCwIXtKAH7czev866ThsTgy8CwlXjnKZna2VHwChglzLleYrcHz1eQEIJlGRQxB53nqA==
+"@babel/plugin-transform-modules-commonjs@^7.7.5":
+ version "7.7.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.5.tgz#1d27f5eb0bcf7543e774950e5b2fa782e637b345"
+ integrity sha512-9Cq4zTFExwFhQI6MT1aFxgqhIsMWQWDVwOgLzl7PTWJHsNaqFvklAU+Oz6AQLAS0dJKTwZSOCo20INwktxpi3Q==
dependencies:
- "@babel/helper-module-transforms" "^7.7.4"
+ "@babel/helper-module-transforms" "^7.7.5"
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/helper-simple-access" "^7.7.4"
babel-plugin-dynamic-import-node "^2.3.0"
@@ -592,10 +604,10 @@
"@babel/helper-plugin-utils" "^7.0.0"
"@babel/plugin-syntax-jsx" "^7.7.4"
-"@babel/plugin-transform-regenerator@^7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.4.tgz#d18eac0312a70152d7d914cbed2dc3999601cfc0"
- integrity sha512-e7MWl5UJvmPEwFJTwkBlPmqixCtr9yAASBqff4ggXTNicZiwbF8Eefzm6NVgfiBp7JdAGItecnctKTgH44q2Jw==
+"@babel/plugin-transform-regenerator@^7.7.5":
+ version "7.7.5"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.7.5.tgz#3a8757ee1a2780f390e89f246065ecf59c26fce9"
+ integrity sha512-/8I8tPvX2FkuEyWbjRCt4qTAgZK0DVy8QRguhA524UH48RfGJy94On2ri+dCuwOpcerPRl9O4ebQkRcVzIaGBw==
dependencies:
regenerator-transform "^0.14.0"
@@ -661,10 +673,10 @@
"@babel/helper-create-regexp-features-plugin" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
-"@babel/preset-env@^7.7.4":
- version "7.7.4"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.4.tgz#ccaf309ae8d1ee2409c85a4e2b5e280ceee830f8"
- integrity sha512-Dg+ciGJjwvC1NIe/DGblMbcGq1HOtKbw8RLl4nIjlfcILKEOkWT/vRqPpumswABEBVudii6dnVwrBtzD7ibm4g==
+"@babel/preset-env@^7.7.6":
+ version "7.7.6"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.7.6.tgz#39ac600427bbb94eec6b27953f1dfa1d64d457b2"
+ integrity sha512-k5hO17iF/Q7tR9Jv8PdNBZWYW6RofxhnxKjBMc0nG4JTaWvOTiPoO/RLFwAKcA4FpmuBFm6jkoqaRJLGi0zdaQ==
dependencies:
"@babel/helper-module-imports" "^7.7.4"
"@babel/helper-plugin-utils" "^7.0.0"
@@ -694,8 +706,8 @@
"@babel/plugin-transform-function-name" "^7.7.4"
"@babel/plugin-transform-literals" "^7.7.4"
"@babel/plugin-transform-member-expression-literals" "^7.7.4"
- "@babel/plugin-transform-modules-amd" "^7.7.4"
- "@babel/plugin-transform-modules-commonjs" "^7.7.4"
+ "@babel/plugin-transform-modules-amd" "^7.7.5"
+ "@babel/plugin-transform-modules-commonjs" "^7.7.5"
"@babel/plugin-transform-modules-systemjs" "^7.7.4"
"@babel/plugin-transform-modules-umd" "^7.7.4"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.7.4"
@@ -703,7 +715,7 @@
"@babel/plugin-transform-object-super" "^7.7.4"
"@babel/plugin-transform-parameters" "^7.7.4"
"@babel/plugin-transform-property-literals" "^7.7.4"
- "@babel/plugin-transform-regenerator" "^7.7.4"
+ "@babel/plugin-transform-regenerator" "^7.7.5"
"@babel/plugin-transform-reserved-words" "^7.7.4"
"@babel/plugin-transform-shorthand-properties" "^7.7.4"
"@babel/plugin-transform-spread" "^7.7.4"
@@ -713,7 +725,7 @@
"@babel/plugin-transform-unicode-regex" "^7.7.4"
"@babel/types" "^7.7.4"
browserslist "^4.6.0"
- core-js-compat "^3.1.1"
+ core-js-compat "^3.4.7"
invariant "^2.2.2"
js-levenshtein "^1.1.3"
semver "^5.5.0"
@@ -1597,13 +1609,13 @@ array-flatten@^2.1.0:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
-array-includes@^3.0.3:
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d"
- integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=
+array-includes@^3.0.3, array-includes@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.0.tgz#48a929ef4c6bb1fa6dc4a92c9b023a261b0ca404"
+ integrity sha512-ONOEQoKrvXPKk7Su92Co0YMqYO32FfqJTzkKU9u2UpIXyYZIzLSvpdg4AwvSw4mSUW0czu6inK+zby6Oj6gDjQ==
dependencies:
- define-properties "^1.1.2"
- es-abstract "^1.7.0"
+ define-properties "^1.1.3"
+ es-abstract "^1.17.0-next.0"
array-union@^1.0.1:
version "1.0.2"
@@ -2143,16 +2155,7 @@ browserify-zlib@^0.2.0:
dependencies:
pako "~1.0.5"
-browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.8.0:
- version "4.8.0"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.0.tgz#6f06b0f974a7cc3a84babc2ccc56493668e3c789"
- integrity sha512-HYnxc/oLRWvJ3TsGegR0SRL/UDnknGq2s/a8dYYEO+kOQ9m9apKoS5oiathLKZdh/e9uE+/J3j92qPlGD/vTqA==
- dependencies:
- caniuse-lite "^1.0.30001012"
- electron-to-chromium "^1.3.317"
- node-releases "^1.1.41"
-
-browserslist@^4.6.4:
+browserslist@^4.0.0, browserslist@^4.6.0, browserslist@^4.8.0, browserslist@^4.8.2:
version "4.8.2"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.2.tgz#b45720ad5fbc8713b7253c20766f701c9a694289"
integrity sha512-+M4oeaTplPm/f1pXDw84YohEv7B1i/2Aisei8s4s6k3QsoSHa7i5sz8u/cGQkkatCPxMASKxPualR4wwYgVboA==
@@ -2161,6 +2164,15 @@ browserslist@^4.6.4:
electron-to-chromium "^1.3.322"
node-releases "^1.1.42"
+browserslist@^4.6.4:
+ version "4.8.3"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.8.3.tgz#65802fcd77177c878e015f0e3189f2c4f627ba44"
+ integrity sha512-iU43cMMknxG1ClEZ2MDKeonKE1CCrFVkQK2AqO2YWFmvIrx4JWrvQ4w4hQez6EpVI8rHTtqh/ruHHDHSOKxvUg==
+ dependencies:
+ caniuse-lite "^1.0.30001017"
+ electron-to-chromium "^1.3.322"
+ node-releases "^1.1.44"
+
bser@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719"
@@ -2207,6 +2219,11 @@ builtin-status-codes@^3.0.0:
resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
+bulma@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.8.0.tgz#ac1606431703a4761b18a4a2d5cc1fa864a2aece"
+ integrity sha512-nhf3rGyiZh/VM7FrSJ/5KeLlfaFkXz0nYcXriynfPH4vVpnxnqyEwaNGdNCVzHyyCA3cHgkQAMpdF/SFbFGZfA==
+
bytes@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
@@ -2217,26 +2234,6 @@ bytes@3.1.0:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
-cacache@^11.2.0:
- version "11.3.3"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.3.tgz#8bd29df8c6a718a6ebd2d010da4d7972ae3bbadc"
- integrity sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==
- dependencies:
- bluebird "^3.5.5"
- chownr "^1.1.1"
- figgy-pudding "^3.5.1"
- glob "^7.1.4"
- graceful-fs "^4.1.15"
- lru-cache "^5.1.1"
- mississippi "^3.0.0"
- mkdirp "^0.5.1"
- move-concurrently "^1.0.1"
- promise-inflight "^1.0.1"
- rimraf "^2.6.3"
- ssri "^6.0.1"
- unique-filename "^1.1.1"
- y18n "^4.0.0"
-
cacache@^12.0.2, cacache@^12.0.3:
version "12.0.3"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-12.0.3.tgz#be99abba4e1bf5df461cd5a2c1071fc432573390"
@@ -2353,10 +2350,15 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001012:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001013.tgz#da2440d4d266a17d40eb79bd19c0c8cc1d029c72"
integrity sha512-hOAXaWKuq/UVFgYawxIOdPdyMQdYcwOCDOjnZcKn7wCgFUrhP7smuNZjGLuJlPSgE6aRA4cRJ+bGSrhtEt7ZAg==
-caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001015:
- version "1.0.30001015"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001015.tgz#15a7ddf66aba786a71d99626bc8f2b91c6f0f5f0"
- integrity sha512-/xL2AbW/XWHNu1gnIrO8UitBGoFthcsDgU9VLK1/dpsoxbaD5LscHozKze05R6WLsBvLhqv78dAPozMFQBYLbQ==
+caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001017:
+ version "1.0.30001019"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001019.tgz#857e3fccaad2b2feb3f1f6d8a8f62d747ea648e1"
+ integrity sha512-6ljkLtF1KM5fQ+5ZN0wuyVvvebJxgJPTmScOMaFuQN2QuOzvRJnWSKfzQskQU5IOU4Gap3zasYPIinzwUjoj/g==
+
+caniuse-lite@^1.0.30001015:
+ version "1.0.30001016"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001016.tgz#16ea48d7d6e8caf3cad3295c2d746fe38c4e7f66"
+ integrity sha512-yYQ2QfotceRiH4U+h1Us86WJXtVHDmy3nEKIdYPsZCYnOV5/tMgGbmoIlrMzmh2VXlproqYtVaKeGDBkMZifFA==
capture-exit@^1.2.0:
version "1.2.0"
@@ -2657,16 +2659,16 @@ compressible@~2.0.16:
dependencies:
mime-db ">= 1.40.0 < 2"
-compression-webpack-plugin@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.0.0.tgz#097d2e4d95c3a14cb5c8ed20899009ab5b9bbca0"
- integrity sha512-ls+oKw4eRbvaSv/hj9NmctihhBcR26j76JxV0bLRLcWhrUBdQFgd06z/Kgg7exyQvtWWP484wZxs0gIUX3NO0Q==
+compression-webpack-plugin@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/compression-webpack-plugin/-/compression-webpack-plugin-3.0.1.tgz#be7a343e6dfbccbd64a77c5fbe29627d140fc321"
+ integrity sha512-FOwoBVzDiwSdJDnZTKXDpAjJU90k8SbChgxnoiYwTo15xjIDJkSC8wFKuc13DymXjgasPEqzS5+2RUgSKXdKKA==
dependencies:
- cacache "^11.2.0"
+ cacache "^13.0.1"
find-cache-dir "^3.0.0"
neo-async "^2.5.0"
- schema-utils "^1.0.0"
- serialize-javascript "^1.4.0"
+ schema-utils "^2.6.1"
+ serialize-javascript "^2.1.2"
webpack-sources "^1.0.1"
compression@^1.7.4:
@@ -2770,10 +2772,10 @@ copy-descriptor@^0.1.0:
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-copy-webpack-plugin@^5.0.5:
- version "5.0.5"
- resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.0.5.tgz#731df6a837a2ef0f8f8e2345bdfe9b7c62a2da68"
- integrity sha512-7N68eIoQTyudAuxkfPT7HzGoQ+TsmArN/I3HFwG+lVE3FNzqvZKIiaxtYh4o3BIznioxUvx9j26+Rtsc9htQUQ==
+copy-webpack-plugin@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz#5481a03dea1123d88a988c6ff8b78247214f0b88"
+ integrity sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==
dependencies:
cacache "^12.0.3"
find-cache-dir "^2.1.0"
@@ -2785,22 +2787,16 @@ copy-webpack-plugin@^5.0.5:
normalize-path "^3.0.0"
p-limit "^2.2.1"
schema-utils "^1.0.0"
- serialize-javascript "^2.1.0"
+ serialize-javascript "^2.1.2"
webpack-log "^2.0.0"
-core-js-compat@^3.1.1:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.1.3.tgz#0cc3ba4c7f62928c2837e1cffbe8dc78b4f1ae14"
- integrity sha512-EP018pVhgwsKHz3YoN1hTq49aRe+h017Kjz0NQz3nXV0cCRMvH3fLQl+vEPGr4r4J5sk4sU3tUC7U1aqTCeJeA==
+core-js-compat@^3.4.7:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.5.0.tgz#5a11a619a9e9dd2dcf1c742b2060bc4a2143e5b6"
+ integrity sha512-E7iJB72svRjJTnm9HDvujzNVMCm3ZcDYEedkJ/sDTNsy/0yooCd9Cg7GSzE7b4e0LfIkjijdB1tqg0pGwxWeWg==
dependencies:
- browserslist "^4.6.0"
- core-js-pure "3.1.3"
- semver "^6.1.0"
-
-core-js-pure@3.1.3:
- version "3.1.3"
- resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.1.3.tgz#4c90752d5b9471f641514f3728f51c1e0783d0b5"
- integrity sha512-k3JWTrcQBKqjkjI0bkfXS0lbpWPxYuHWfMMjC1VDmzU4Q58IwSbuXSo99YO/hUHlw/EB4AlfA2PVxOGkrIq6dA==
+ browserslist "^4.8.2"
+ semver "^6.3.0"
core-js@^1.0.0:
version "1.2.7"
@@ -2983,23 +2979,23 @@ css-list-helpers@^1.0.1:
dependencies:
tcomb "^2.5.0"
-css-loader@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.2.0.tgz#bb570d89c194f763627fcf1f80059c6832d009b2"
- integrity sha512-QTF3Ud5H7DaZotgdcJjGMvyDj5F3Pn1j/sC6VBEOVp94cbwqyIBdcs/quzj4MC1BKQSrTpQznegH/5giYbhnCQ==
+css-loader@^3.3.2:
+ version "3.3.2"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.3.2.tgz#41b2086528aa4fbf8c0692e874bc14f081129b21"
+ integrity sha512-4XSiURS+YEK2fQhmSaM1onnUm0VKWNf6WWBYjkp9YbSDGCBTVZ5XOM6Gkxo8tLgQlzkZOBJvk9trHlDk4gjEYg==
dependencies:
camelcase "^5.3.1"
cssesc "^3.0.0"
icss-utils "^4.1.1"
loader-utils "^1.2.3"
normalize-path "^3.0.0"
- postcss "^7.0.17"
+ postcss "^7.0.23"
postcss-modules-extract-imports "^2.0.0"
postcss-modules-local-by-default "^3.0.2"
- postcss-modules-scope "^2.1.0"
+ postcss-modules-scope "^2.1.1"
postcss-modules-values "^3.0.0"
- postcss-value-parser "^4.0.0"
- schema-utils "^2.0.0"
+ postcss-value-parser "^4.0.2"
+ schema-utils "^2.6.0"
css-prefers-color-scheme@^3.1.1:
version "3.1.1"
@@ -3566,11 +3562,6 @@ ejs@^2.3.4, ejs@^2.6.1:
resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.1.tgz#5b5ab57f718b79d4aca9254457afecd36fa80228"
integrity sha512-kS/gEPzZs3Y1rRsbGX4UOSjtP/CeJP0CxSNZHYxGfVM/VgLcv0ZqM7C45YyTj2DI2g7+P9Dd24C+IMIg6D0nYQ==
-electron-to-chromium@^1.3.317:
- version "1.3.321"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.321.tgz#913869f5ec85daabba0e75c9c314b4bf26cdb01e"
- integrity sha512-jJy/BZK2s2eAjMPXVMSaCmo7/pSY2aKkfQ+LoAb5Wk39qAhyP9r8KU74c4qTgr9cD/lPUhJgReZxxqU0n5puog==
-
electron-to-chromium@^1.3.322:
version "1.3.322"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.322.tgz#a6f7e1c79025c2b05838e8e344f6e89eb83213a8"
@@ -3717,7 +3708,7 @@ error-ex@^1.2.0, error-ex@^1.3.1:
dependencies:
is-arrayish "^0.2.1"
-es-abstract@^1.10.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.5.0, es-abstract@^1.5.1, es-abstract@^1.7.0:
+es-abstract@^1.10.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.15.0, es-abstract@^1.5.0, es-abstract@^1.5.1:
version "1.16.2"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.16.2.tgz#4e874331645e9925edef141e74fc4bd144669d34"
integrity sha512-jYo/J8XU2emLXl3OLwfwtuFfuF2w6DYPs+xy9ZfVyPkDcrauu6LYrw/q2TyCtrbc/KUdCiC5e9UajRhgNkVopA==
@@ -3733,6 +3724,23 @@ es-abstract@^1.10.0, es-abstract@^1.12.0, es-abstract@^1.13.0, es-abstract@^1.15
string.prototype.trimleft "^2.1.0"
string.prototype.trimright "^2.1.0"
+es-abstract@^1.17.0-next.0:
+ version "1.17.0-next.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.0-next.1.tgz#94acc93e20b05a6e96dacb5ab2f1cb3a81fc2172"
+ integrity sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==
+ dependencies:
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+ is-callable "^1.1.4"
+ is-regex "^1.0.4"
+ object-inspect "^1.7.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.0"
+ string.prototype.trimleft "^2.1.0"
+ string.prototype.trimright "^2.1.0"
+
es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -3862,10 +3870,10 @@ eslint-plugin-eslint-plugin@^2.1.0:
resolved "https://registry.yarnpkg.com/eslint-plugin-eslint-plugin/-/eslint-plugin-eslint-plugin-2.1.0.tgz#a7a00f15a886957d855feacaafee264f039e62d5"
integrity sha512-kT3A/ZJftt28gbl/Cv04qezb/NQ1dwYIbi8lyf806XMxkus7DvOVCLIfTXMrorp322Pnoez7+zabXH29tADIDg==
-eslint-plugin-import@~2.19.0:
- version "2.19.0"
- resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.0.tgz#560ddc8236b4e68df57a95c5ba33bcf23300c780"
- integrity sha512-J13f9Slu7BCZq1N2NnWmK7tci/Y1SWWHUaj0J+I1NpzUm8l/Gwnz6KO+JMbM4TcnxU8O/DJ4psa6eZrmNREsOg==
+eslint-plugin-import@~2.19.1:
+ version "2.19.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.19.1.tgz#5654e10b7839d064dd0d46cd1b88ec2133a11448"
+ integrity sha512-x68131aKoCZlCae7rDXKSAQmbT5DQuManyXo2sK6fJJ0aK5CWAkv6A6HJZGgqC8IhjQxYPgo6/IY4Oz8AFsbBw==
dependencies:
array-includes "^3.0.3"
array.prototype.flat "^1.2.1"
@@ -7202,13 +7210,6 @@ node-pre-gyp@^0.12.0:
semver "^5.3.0"
tar "^4"
-node-releases@^1.1.41:
- version "1.1.41"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.41.tgz#57674a82a37f812d18e3b26118aefaf53a00afed"
- integrity sha512-+IctMa7wIs8Cfsa8iYzeaLTFwv5Y4r5jZud+4AnfymzeEXKBCavFX0KBgzVaPVqf0ywa6PrO8/b+bPqdwjGBSg==
- dependencies:
- semver "^6.3.0"
-
node-releases@^1.1.42:
version "1.1.42"
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.42.tgz#a999f6a62f8746981f6da90627a8d2fc090bbad7"
@@ -7216,6 +7217,13 @@ node-releases@^1.1.42:
dependencies:
semver "^6.3.0"
+node-releases@^1.1.44:
+ version "1.1.44"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.44.tgz#cd66438a6eb875e3eb012b6a12e48d9f4326ffd7"
+ integrity sha512-NwbdvJyR7nrcGrXvKAvzc5raj/NkoJudkarh2yIpJ4t0NH4aqjUDz/486P+ynIW5eokKOfzGNRdYoLfBlomruw==
+ dependencies:
+ semver "^6.3.0"
+
nopt@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d"
@@ -8314,10 +8322,10 @@ postcss-modules-local-by-default@^3.0.2:
postcss-selector-parser "^6.0.2"
postcss-value-parser "^4.0.0"
-postcss-modules-scope@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb"
- integrity sha512-91Rjps0JnmtUB0cujlc8KIKCsJXWjzuxGeT/+Q2i2HXKZ7nBUeF9YQTZZTNvHVoNYj1AthsjnGLtqDUE0Op79A==
+postcss-modules-scope@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.1.tgz#33d4fc946602eb5e9355c4165d68a10727689dba"
+ integrity sha512-OXRUPecnHCg8b9xWvldG/jUpRIGPNRka0r4D4j0ESUU2/5IOnpsjfPPmDprM3Ih8CgZ8FXjWqaniK5v4rWt3oQ==
dependencies:
postcss "^7.0.6"
postcss-selector-parser "^6.0.0"
@@ -8627,7 +8635,7 @@ postcss@^5.0.16:
source-map "^0.5.6"
supports-color "^3.2.3"
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6:
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.5, postcss@^7.0.6:
version "7.0.23"
resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.23.tgz#9f9759fad661b15964f3cfc3140f66f1e05eadc1"
integrity sha512-hOlMf3ouRIFXD+j2VJecwssTwbvsPGJVMzupptg+85WA+i7MwyrydmQAgY3R+m0Bc0exunhbJmijy8u8+vufuQ==
@@ -8636,10 +8644,10 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.1
source-map "^0.6.1"
supports-color "^6.1.0"
-postcss@^7.0.2, postcss@^7.0.24:
- version "7.0.24"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.24.tgz#972c3c5be431b32e40caefe6c81b5a19117704c2"
- integrity sha512-Xl0XvdNWg+CblAXzNvbSOUvgJXwSjmbAKORqyw9V2AlHrm1js2gFw9y3jibBAhpKZi8b5JzJCVh/FyzPsTtgTA==
+postcss@^7.0.17, postcss@^7.0.2, postcss@^7.0.24:
+ version "7.0.26"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.26.tgz#5ed615cfcab35ba9bbb82414a4fa88ea10429587"
+ integrity sha512-IY4oRjpXWYshuTDFxMVkJDtWIk2LhsTlu8bZnbEJA4+bYT16Lvpo8Qv6EvDumhYRgzjZl489pmsY3qVgJQ08nA==
dependencies:
chalk "^2.4.2"
source-map "^0.6.1"
@@ -9013,12 +9021,7 @@ react-intl@^2.9.0:
intl-relativeformat "^2.1.0"
invariant "^2.1.1"
-react-is@^16.10.2, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
- version "16.11.0"
- resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.11.0.tgz#b85dfecd48ad1ce469ff558a882ca8e8313928fa"
- integrity sha512-gbBVYR2p8mnriqAwWx9LbuUrShnAuSCNnuPGyc7GJrMVQtPDAh8iLpv7FRuMPFb56KkaVZIYSz1PrjI9q0QPCw==
-
-react-is@^16.8.1:
+react-is@^16.10.2, react-is@^16.3.2, react-is@^16.7.0, react-is@^16.8.1, react-is@^16.8.4, react-is@^16.8.6, react-is@^16.9.0:
version "16.12.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.12.0.tgz#2cc0fe0fba742d97fd527c42a13bec4eeb06241c"
integrity sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==
@@ -9073,10 +9076,10 @@ react-redux-loading-bar@^4.0.8:
prop-types "^15.6.2"
react-lifecycles-compat "^3.0.2"
-react-redux@^7.1.1:
- version "7.1.1"
- resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.1.tgz#ce6eee1b734a7a76e0788b3309bf78ff6b34fa0a"
- integrity sha512-QsW0vcmVVdNQzEkrgzh2W3Ksvr8cqpAv5FhEk7tNEft+5pp7rXxAudTz3VOPawRkLIepItpkEIyLcN/VVXzjTg==
+react-redux@^7.1.3:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/react-redux/-/react-redux-7.1.3.tgz#717a3d7bbe3a1b2d535c94885ce04cdc5a33fc79"
+ integrity sha512-uI1wca+ECG9RoVkWQFF4jDMqmaw0/qnvaSvOoL/GA4dNxf6LoV8sUAcNDvE5NWKs4hFpn0t6wswNQnY3f7HT3w==
dependencies:
"@babel/runtime" "^7.5.5"
hoist-non-react-statics "^3.3.0"
@@ -9590,7 +9593,14 @@ resolve@1.1.7:
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
-resolve@^1.1.7, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1:
+resolve@^1.1.7:
+ version "1.14.2"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.14.2.tgz#dbf31d0fa98b1f29aa5169783b9c290cb865fea2"
+ integrity sha512-EjlOBLBO1kxsUxsKjLt7TAECyKW6fOh1VRkykQkKGzcBbjjPIxBqGh0jf7GJ3k/f5mxMqW3htMD3WdTUVtW8HQ==
+ dependencies:
+ path-parse "^1.0.6"
+
+resolve@^1.12.0, resolve@^1.13.1, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.8.1:
version "1.13.1"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.13.1.tgz#be0aa4c06acd53083505abb35f4d66932ab35d16"
integrity sha512-CxqObCX8K8YtAhOBRg+lrcdn+LK+WYOS8tSjqSFbjtrI5PnS63QPhZl4+yKfrU9tdsbMu9Anr/amegT87M9Z6w==
@@ -9813,7 +9823,7 @@ schema-utils@^1.0.0:
ajv-errors "^1.0.0"
ajv-keywords "^3.1.0"
-schema-utils@^2.0.0, schema-utils@^2.1.0, schema-utils@^2.6.1:
+schema-utils@^2.0.0, schema-utils@^2.1.0, schema-utils@^2.6.0, schema-utils@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.1.tgz#eb78f0b945c7bcfa2082b3565e8db3548011dc4f"
integrity sha512-0WXHDs1VDJyo+Zqs9TKLKyD/h7yDpHUhEFsM2CzkICFdoX1av+GBq/J2xRTFfsQO5kBfhZzANf2VcIm84jqDbg==
@@ -9851,7 +9861,7 @@ semver@4.3.2:
resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.2.tgz#c7a07158a80bedd052355b770d82d6640f803be7"
integrity sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c=
-semver@^6.0.0, semver@^6.1.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
+semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@@ -9875,15 +9885,15 @@ send@0.17.1:
range-parser "~1.2.1"
statuses "~1.5.0"
-serialize-javascript@^1.4.0, serialize-javascript@^1.7.0:
+serialize-javascript@^1.7.0:
version "1.9.1"
resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-1.9.1.tgz#cfc200aef77b600c47da9bb8149c943e798c2fdb"
integrity sha512-0Vb/54WJ6k5v8sSWN09S0ora+Hnr+cX40r9F170nT+mSkaxltoE/7R3OrIdBSUv1OoiobH1QoWQbCnAO+e8J1A==
-serialize-javascript@^2.1.0, serialize-javascript@^2.1.1:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.1.tgz#952907a04a3e3a75af7f73d92d15e233862048b2"
- integrity sha512-MPLPRpD4FNqWq9tTIjYG5LesFouDhdyH0EPY3gVK4DRD5+g4aDqdNSzLIwceulo3Yj+PL1bPh6laE5+H6LTcrQ==
+serialize-javascript@^2.1.1, serialize-javascript@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61"
+ integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==
serve-index@^1.9.1:
version "1.9.1"