mirror of
https://git.kescher.at/CatCatNya/catstodon.git
synced 2024-11-26 11:21:36 +01:00
Merge remote-tracking branch 'upstream/main' into develop
# Conflicts: # .github/workflows/build-image.yml # Gemfile.lock # app/javascript/flavours/glitch/actions/interactions.js # config/initializers/rack_attack.rb # config/locales/en_GB.yml
This commit is contained in:
commit
8de39432a9
719 changed files with 7756 additions and 4973 deletions
|
@ -1,23 +0,0 @@
|
||||||
version = 1
|
|
||||||
|
|
||||||
test_patterns = ["app/javascript/mastodon/**/__tests__/**"]
|
|
||||||
|
|
||||||
exclude_patterns = [
|
|
||||||
"db/migrate/**",
|
|
||||||
"db/post_migrate/**"
|
|
||||||
]
|
|
||||||
|
|
||||||
[[analyzers]]
|
|
||||||
name = "ruby"
|
|
||||||
enabled = true
|
|
||||||
|
|
||||||
[[analyzers]]
|
|
||||||
name = "javascript"
|
|
||||||
enabled = true
|
|
||||||
|
|
||||||
[analyzers.meta]
|
|
||||||
environment = [
|
|
||||||
"browser",
|
|
||||||
"jest",
|
|
||||||
"nodejs"
|
|
||||||
]
|
|
87
.eslintrc.js
87
.eslintrc.js
|
@ -3,6 +3,8 @@ module.exports = {
|
||||||
|
|
||||||
extends: [
|
extends: [
|
||||||
'eslint:recommended',
|
'eslint:recommended',
|
||||||
|
'plugin:react/recommended',
|
||||||
|
'plugin:jsx-a11y/recommended',
|
||||||
],
|
],
|
||||||
|
|
||||||
env: {
|
env: {
|
||||||
|
@ -80,8 +82,6 @@ module.exports = {
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
'no-empty': 'off',
|
'no-empty': 'off',
|
||||||
'no-nested-ternary': 'warn',
|
|
||||||
'no-prototype-builtins': 'off',
|
|
||||||
'no-restricted-properties': [
|
'no-restricted-properties': [
|
||||||
'error',
|
'error',
|
||||||
{ property: 'substring', message: 'Use .slice instead of .substring.' },
|
{ property: 'substring', message: 'Use .slice instead of .substring.' },
|
||||||
|
@ -113,55 +113,42 @@ module.exports = {
|
||||||
'react/jsx-boolean-value': 'error',
|
'react/jsx-boolean-value': 'error',
|
||||||
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
|
'react/jsx-closing-bracket-location': ['error', 'line-aligned'],
|
||||||
'react/jsx-curly-spacing': 'error',
|
'react/jsx-curly-spacing': 'error',
|
||||||
|
'react/display-name': 'off',
|
||||||
'react/jsx-equals-spacing': 'error',
|
'react/jsx-equals-spacing': 'error',
|
||||||
'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
|
'react/jsx-first-prop-new-line': ['error', 'multiline-multiprop'],
|
||||||
'react/jsx-indent': ['error', 2],
|
'react/jsx-indent': ['error', 2],
|
||||||
'react/jsx-no-bind': 'error',
|
'react/jsx-no-bind': 'error',
|
||||||
'react/jsx-no-duplicate-props': 'error',
|
'react/jsx-no-target-blank': 'off',
|
||||||
'react/jsx-no-undef': 'error',
|
|
||||||
'react/jsx-tag-spacing': 'error',
|
'react/jsx-tag-spacing': 'error',
|
||||||
'react/jsx-uses-react': 'error',
|
|
||||||
'react/jsx-uses-vars': 'error',
|
|
||||||
'react/jsx-wrap-multilines': 'error',
|
'react/jsx-wrap-multilines': 'error',
|
||||||
'react/no-multi-comp': 'off',
|
'react/no-deprecated': 'off',
|
||||||
'react/no-string-refs': 'error',
|
'react/no-unknown-property': 'off',
|
||||||
'react/prop-types': 'error',
|
|
||||||
'react/self-closing-comp': 'error',
|
'react/self-closing-comp': 'error',
|
||||||
|
|
||||||
|
// recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/main/src/index.js
|
||||||
'jsx-a11y/accessible-emoji': 'warn',
|
'jsx-a11y/accessible-emoji': 'warn',
|
||||||
'jsx-a11y/alt-text': 'warn',
|
'jsx-a11y/click-events-have-key-events': 'off',
|
||||||
'jsx-a11y/anchor-has-content': 'warn',
|
'jsx-a11y/label-has-associated-control': 'off',
|
||||||
'jsx-a11y/anchor-is-valid': [
|
'jsx-a11y/media-has-caption': 'off',
|
||||||
'warn',
|
'jsx-a11y/no-autofocus': 'off',
|
||||||
{
|
// recommended rule is:
|
||||||
components: [
|
// 'jsx-a11y/no-interactive-element-to-noninteractive-role': [
|
||||||
'Link',
|
// 'error',
|
||||||
'NavLink',
|
// {
|
||||||
],
|
// tr: ['none', 'presentation'],
|
||||||
specialLink: [
|
// canvas: ['img'],
|
||||||
'to',
|
// },
|
||||||
],
|
// ],
|
||||||
aspect: [
|
'jsx-a11y/no-interactive-element-to-noninteractive-role': 'off',
|
||||||
'noHref',
|
// recommended rule is:
|
||||||
'invalidHref',
|
// 'jsx-a11y/no-noninteractive-element-interactions': [
|
||||||
'preferButton',
|
// 'error',
|
||||||
],
|
// {
|
||||||
},
|
// body: ['onError', 'onLoad'],
|
||||||
],
|
// iframe: ['onError', 'onLoad'],
|
||||||
'jsx-a11y/aria-activedescendant-has-tabindex': 'warn',
|
// img: ['onError', 'onLoad'],
|
||||||
'jsx-a11y/aria-props': 'warn',
|
// },
|
||||||
'jsx-a11y/aria-proptypes': 'warn',
|
// ],
|
||||||
'jsx-a11y/aria-role': 'warn',
|
|
||||||
'jsx-a11y/aria-unsupported-elements': 'warn',
|
|
||||||
'jsx-a11y/heading-has-content': 'warn',
|
|
||||||
'jsx-a11y/html-has-lang': 'warn',
|
|
||||||
'jsx-a11y/iframe-has-title': 'warn',
|
|
||||||
'jsx-a11y/img-redundant-alt': 'warn',
|
|
||||||
'jsx-a11y/interactive-supports-focus': 'warn',
|
|
||||||
'jsx-a11y/label-has-for': 'off',
|
|
||||||
'jsx-a11y/mouse-events-have-key-events': 'warn',
|
|
||||||
'jsx-a11y/no-access-key': 'warn',
|
|
||||||
'jsx-a11y/no-distracting-elements': 'warn',
|
|
||||||
'jsx-a11y/no-noninteractive-element-interactions': [
|
'jsx-a11y/no-noninteractive-element-interactions': [
|
||||||
'warn',
|
'warn',
|
||||||
{
|
{
|
||||||
|
@ -170,8 +157,18 @@ module.exports = {
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
// recommended rule is:
|
||||||
|
// 'jsx-a11y/no-noninteractive-tabindex': [
|
||||||
|
// 'error',
|
||||||
|
// {
|
||||||
|
// tags: [],
|
||||||
|
// roles: ['tabpanel'],
|
||||||
|
// allowExpressionValues: true,
|
||||||
|
// },
|
||||||
|
// ],
|
||||||
|
'jsx-a11y/no-noninteractive-tabindex': 'off',
|
||||||
'jsx-a11y/no-onchange': 'warn',
|
'jsx-a11y/no-onchange': 'warn',
|
||||||
'jsx-a11y/no-redundant-roles': 'warn',
|
// recommended is full 'error'
|
||||||
'jsx-a11y/no-static-element-interactions': [
|
'jsx-a11y/no-static-element-interactions': [
|
||||||
'warn',
|
'warn',
|
||||||
{
|
{
|
||||||
|
@ -180,10 +177,6 @@ module.exports = {
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
'jsx-a11y/role-has-required-aria-props': 'warn',
|
|
||||||
'jsx-a11y/role-supports-aria-props': 'off',
|
|
||||||
'jsx-a11y/scope': 'warn',
|
|
||||||
'jsx-a11y/tabindex-no-positive': 'warn',
|
|
||||||
|
|
||||||
'import/extensions': [
|
'import/extensions': [
|
||||||
'error',
|
'error',
|
||||||
|
|
2
.github/workflows/check-i18n.yml
vendored
2
.github/workflows/check-i18n.yml
vendored
|
@ -30,7 +30,7 @@ jobs:
|
||||||
- name: Check locale file normalization
|
- name: Check locale file normalization
|
||||||
run: bundle exec i18n-tasks check-normalized
|
run: bundle exec i18n-tasks check-normalized
|
||||||
- name: Check for unused strings
|
- name: Check for unused strings
|
||||||
run: bundle exec i18n-tasks unused -l en
|
run: bundle exec i18n-tasks unused
|
||||||
- name: Check for wrong string interpolations
|
- name: Check for wrong string interpolations
|
||||||
run: bundle exec i18n-tasks check-consistent-interpolations
|
run: bundle exec i18n-tasks check-consistent-interpolations
|
||||||
- name: Check that all required locale files exist
|
- name: Check that all required locale files exist
|
||||||
|
|
48
.github/workflows/lint-css.yml
vendored
Normal file
48
.github/workflows/lint-css.yml
vendored
Normal file
|
@ -0,0 +1,48 @@
|
||||||
|
name: CSS Linting
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.prettier*'
|
||||||
|
- 'stylelint.config.js'
|
||||||
|
- '**/*.css'
|
||||||
|
- '**/*.scss'
|
||||||
|
- '.github/workflows/lint-css.yml'
|
||||||
|
- '.github/stylelint-matcher.json'
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.prettier*'
|
||||||
|
- 'stylelint.config.js'
|
||||||
|
- '**/*.css'
|
||||||
|
- '**/*.scss'
|
||||||
|
- '.github/workflows/lint-css.yml'
|
||||||
|
- '.github/stylelint-matcher.json'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- uses: xt0rted/stylelint-problem-matcher@v1
|
||||||
|
|
||||||
|
- run: echo "::add-matcher::.github/stylelint-matcher.json"
|
||||||
|
|
||||||
|
- name: Stylelint
|
||||||
|
run: yarn test:lint:sass
|
40
.github/workflows/lint-js.yml
vendored
Normal file
40
.github/workflows/lint-js.yml
vendored
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
name: JavaScript Linting
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.prettier*'
|
||||||
|
- '.eslint*'
|
||||||
|
- '**/*.js'
|
||||||
|
- '.github/workflows/lint-js.yml'
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'package.json'
|
||||||
|
- 'yarn.lock'
|
||||||
|
- '.prettier*'
|
||||||
|
- '.eslint*'
|
||||||
|
- '**/*.js'
|
||||||
|
- '.github/workflows/lint-js.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Clone repository
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
|
||||||
|
- name: Set up Node.js
|
||||||
|
uses: actions/setup-node@v3
|
||||||
|
with:
|
||||||
|
cache: yarn
|
||||||
|
|
||||||
|
- name: Install all yarn packages
|
||||||
|
run: yarn --frozen-lockfile
|
||||||
|
|
||||||
|
- name: ESLint
|
||||||
|
run: yarn test:lint:js
|
2
.github/workflows/lint-json.yml
vendored
2
.github/workflows/lint-json.yml
vendored
|
@ -9,6 +9,7 @@ on:
|
||||||
- '.prettier*'
|
- '.prettier*'
|
||||||
- '**/*.json'
|
- '**/*.json'
|
||||||
- '.github/workflows/lint-json.yml'
|
- '.github/workflows/lint-json.yml'
|
||||||
|
- '!app/javascript/mastodon/locales/*.json'
|
||||||
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
|
@ -17,6 +18,7 @@ on:
|
||||||
- '.prettier*'
|
- '.prettier*'
|
||||||
- '**/*.json'
|
- '**/*.json'
|
||||||
- '.github/workflows/lint-json.yml'
|
- '.github/workflows/lint-json.yml'
|
||||||
|
- '!app/javascript/mastodon/locales/*.json'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
|
|
41
.github/workflows/lint-ruby.yml
vendored
Normal file
41
.github/workflows/lint-ruby.yml
vendored
Normal file
|
@ -0,0 +1,41 @@
|
||||||
|
name: Ruby Linting
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches-ignore:
|
||||||
|
- 'dependabot/**'
|
||||||
|
paths:
|
||||||
|
- 'Gemfile*'
|
||||||
|
- '.rubocop.yml'
|
||||||
|
- '**/*.rb'
|
||||||
|
- '**/*.rake'
|
||||||
|
- '.github/workflows/lint-ruby.yml'
|
||||||
|
|
||||||
|
pull_request:
|
||||||
|
paths:
|
||||||
|
- 'Gemfile*'
|
||||||
|
- '.rubocop.yml'
|
||||||
|
- '**/*.rb'
|
||||||
|
- '**/*.rake'
|
||||||
|
- '.github/workflows/lint-ruby.yml'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Checkout Code
|
||||||
|
uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: Set-up RuboCop Problem Mathcher
|
||||||
|
uses: r7kamura/rubocop-problem-matchers-action@v1
|
||||||
|
|
||||||
|
- name: Run rubocop
|
||||||
|
uses: github/super-linter@v4
|
||||||
|
env:
|
||||||
|
DEFAULT_BRANCH: main
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
LINTER_RULES_PATH: .
|
||||||
|
RUBY_CONFIG_FILE: .rubocop.yml
|
||||||
|
VALIDATE_ALL_CODEBASE: false
|
||||||
|
VALIDATE_RUBY: true
|
2
.github/workflows/lint-yml.yml
vendored
2
.github/workflows/lint-yml.yml
vendored
|
@ -10,6 +10,7 @@ on:
|
||||||
- '**/*.yaml'
|
- '**/*.yaml'
|
||||||
- '**/*.yml'
|
- '**/*.yml'
|
||||||
- '.github/workflows/lint-yml.yml'
|
- '.github/workflows/lint-yml.yml'
|
||||||
|
- '!config/locales/*.yml'
|
||||||
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
paths:
|
||||||
|
@ -19,6 +20,7 @@ on:
|
||||||
- '**/*.yaml'
|
- '**/*.yaml'
|
||||||
- '**/*.yml'
|
- '**/*.yml'
|
||||||
- '.github/workflows/lint-yml.yml'
|
- '.github/workflows/lint-yml.yml'
|
||||||
|
- '!config/locales/*.yml'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
lint:
|
lint:
|
||||||
|
|
83
.github/workflows/linter.yml
vendored
83
.github/workflows/linter.yml
vendored
|
@ -1,83 +0,0 @@
|
||||||
---
|
|
||||||
#################################
|
|
||||||
#################################
|
|
||||||
## Super Linter GitHub Actions ##
|
|
||||||
#################################
|
|
||||||
#################################
|
|
||||||
name: Lint Code Base
|
|
||||||
|
|
||||||
#
|
|
||||||
# Documentation:
|
|
||||||
# https://docs.github.com/en/actions/learn-github-actions/workflow-syntax-for-github-actions
|
|
||||||
#
|
|
||||||
|
|
||||||
#############################
|
|
||||||
# Start the job on all push #
|
|
||||||
#############################
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches-ignore: [main]
|
|
||||||
# Remove the line above to run when pushing to master
|
|
||||||
pull_request:
|
|
||||||
branches: [main]
|
|
||||||
|
|
||||||
###############
|
|
||||||
# Set the Job #
|
|
||||||
###############
|
|
||||||
permissions:
|
|
||||||
checks: write
|
|
||||||
contents: read
|
|
||||||
pull-requests: write
|
|
||||||
statuses: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
# Name the Job
|
|
||||||
name: Lint Code Base
|
|
||||||
# Set the agent to run on
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
##################
|
|
||||||
# Load all steps #
|
|
||||||
##################
|
|
||||||
steps:
|
|
||||||
##########################
|
|
||||||
# Checkout the code base #
|
|
||||||
##########################
|
|
||||||
- name: Checkout Code
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
with:
|
|
||||||
# Full git history is needed to get a proper list of changed files within `super-linter`
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: Set-up Node.js
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version-file: .nvmrc
|
|
||||||
cache: yarn
|
|
||||||
- name: Install dependencies
|
|
||||||
run: yarn install --frozen-lockfile
|
|
||||||
- name: Set-up RuboCop Problem Mathcher
|
|
||||||
uses: r7kamura/rubocop-problem-matchers-action@v1
|
|
||||||
- name: Set-up Stylelint Problem Matcher
|
|
||||||
uses: xt0rted/stylelint-problem-matcher@v1
|
|
||||||
# https://github.com/xt0rted/stylelint-problem-matcher/issues/360
|
|
||||||
- run: echo "::add-matcher::.github/stylelint-matcher.json"
|
|
||||||
|
|
||||||
################################
|
|
||||||
# Run Linter against code base #
|
|
||||||
################################
|
|
||||||
- name: Lint Code Base
|
|
||||||
uses: github/super-linter@v4
|
|
||||||
env:
|
|
||||||
CSS_FILE_NAME: stylelint.config.js
|
|
||||||
DEFAULT_BRANCH: main
|
|
||||||
NO_COLOR: 1 # https://github.com/xt0rted/stylelint-problem-matcher/issues/360
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
JAVASCRIPT_ES_CONFIG_FILE: .eslintrc.js
|
|
||||||
LINTER_RULES_PATH: .
|
|
||||||
RUBY_CONFIG_FILE: .rubocop.yml
|
|
||||||
VALIDATE_ALL_CODEBASE: false
|
|
||||||
VALIDATE_CSS: true
|
|
||||||
VALIDATE_JAVASCRIPT_ES: true
|
|
||||||
VALIDATE_RUBY: true
|
|
56
CHANGELOG.md
56
CHANGELOG.md
|
@ -3,19 +3,27 @@ Changelog
|
||||||
|
|
||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## [4.1.0] - UNRELEASED
|
## [4.1.0] - 2023-02-10
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
||||||
- **Add support for importing/exporting server-wide domain blocks** ([enbylenore](https://github.com/mastodon/mastodon/pull/20597), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/21471), [dariusk](https://github.com/mastodon/mastodon/pull/22803), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/21470))
|
- **Add support for importing/exporting server-wide domain blocks** ([enbylenore](https://github.com/mastodon/mastodon/pull/20597), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/21471), [dariusk](https://github.com/mastodon/mastodon/pull/22803), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/21470))
|
||||||
- Add listing of followed hashtags ([connorshea](https://github.com/mastodon/mastodon/pull/21773))
|
- **Add listing of followed hashtags** ([connorshea](https://github.com/mastodon/mastodon/pull/21773))
|
||||||
- Add support for editing media description and focus point of already-sent posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20878))
|
- **Add support for editing media description and focus point of already-sent posts** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20878))
|
||||||
- Add follow request banner on account header ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20785))
|
- Previously, you could add and remove attachments, but not edit media description of already-attached media
|
||||||
- Add confirmation screen when handling reports ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22375), [Gargron](https://github.com/mastodon/mastodon/pull/23156), [tribela](https://github.com/mastodon/mastodon/pull/23178))
|
- REST API changes:
|
||||||
|
- `PUT /api/v1/statuses/:id` now takes an extra `media_attributes[]` array parameter with the `id` of the updated media and their updated `description`, `focus`, and `thumbnail`
|
||||||
|
- **Add follow request banner on account header** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20785))
|
||||||
|
- REST API changes:
|
||||||
|
- `Relationship` entities have an extra `requested_by` boolean attribute representing whether the represented user has requested to follow you
|
||||||
|
- **Add confirmation screen when handling reports** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22375), [Gargron](https://github.com/mastodon/mastodon/pull/23156), [tribela](https://github.com/mastodon/mastodon/pull/23178))
|
||||||
- Add option to make the landing page be `/about` even when trends are enabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20808))
|
- Add option to make the landing page be `/about` even when trends are enabled ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20808))
|
||||||
- Add `noindex` setting back to the admin interface ([prplecake](https://github.com/mastodon/mastodon/pull/22205))
|
- Add `noindex` setting back to the admin interface ([prplecake](https://github.com/mastodon/mastodon/pull/22205))
|
||||||
- Add instance peers API endpoint toggle back to the admin interface ([dariusk](https://github.com/mastodon/mastodon/pull/22810))
|
- Add instance peers API endpoint toggle back to the admin interface ([dariusk](https://github.com/mastodon/mastodon/pull/22810))
|
||||||
- Add instance activity API endpoint toggle back to the admin interface ([dariusk](https://github.com/mastodon/mastodon/pull/22833))
|
- Add instance activity API endpoint toggle back to the admin interface ([dariusk](https://github.com/mastodon/mastodon/pull/22833))
|
||||||
|
- Add setting for status page URL ([Gargron](https://github.com/mastodon/mastodon/pull/23390), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/23499))
|
||||||
|
- REST API changes:
|
||||||
|
- Add `configuration.urls.status` attribute to the object returned by `GET /api/v1/instance`
|
||||||
- Add `account.approved` webhook ([Saiv46](https://github.com/mastodon/mastodon/pull/22938))
|
- Add `account.approved` webhook ([Saiv46](https://github.com/mastodon/mastodon/pull/22938))
|
||||||
- Add 12 hours option to polls ([Pleclown](https://github.com/mastodon/mastodon/pull/21131))
|
- Add 12 hours option to polls ([Pleclown](https://github.com/mastodon/mastodon/pull/21131))
|
||||||
- Add dropdown menu item to open admin interface for remote domains ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21895))
|
- Add dropdown menu item to open admin interface for remote domains ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21895))
|
||||||
|
@ -25,6 +33,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Add `tootctl accounts prune` ([tribela](https://github.com/mastodon/mastodon/pull/18397))
|
- Add `tootctl accounts prune` ([tribela](https://github.com/mastodon/mastodon/pull/18397))
|
||||||
- Add `tootctl domains purge` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22063))
|
- Add `tootctl domains purge` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22063))
|
||||||
- Add `SIDEKIQ_CONCURRENCY` environment variable ([muffinista](https://github.com/mastodon/mastodon/pull/19589))
|
- Add `SIDEKIQ_CONCURRENCY` environment variable ([muffinista](https://github.com/mastodon/mastodon/pull/19589))
|
||||||
|
- Add `DB_POOL` environment variable support for streaming server ([Gargron](https://github.com/mastodon/mastodon/pull/23470))
|
||||||
- Add `MIN_THREADS` environment variable to set minimum Puma threads ([jimeh](https://github.com/mastodon/mastodon/pull/21048))
|
- Add `MIN_THREADS` environment variable to set minimum Puma threads ([jimeh](https://github.com/mastodon/mastodon/pull/21048))
|
||||||
- Add explanation text to log-in page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20946))
|
- Add explanation text to log-in page ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20946))
|
||||||
- Add user profile OpenGraph tag on post pages ([bramus](https://github.com/mastodon/mastodon/pull/21423))
|
- Add user profile OpenGraph tag on post pages ([bramus](https://github.com/mastodon/mastodon/pull/21423))
|
||||||
|
@ -38,11 +47,15 @@ All notable changes to this project will be documented in this file.
|
||||||
- Add brotli compression to `assets:precompile` ([Izorkin](https://github.com/mastodon/mastodon/pull/19025))
|
- Add brotli compression to `assets:precompile` ([Izorkin](https://github.com/mastodon/mastodon/pull/19025))
|
||||||
- Add “disabled” account filter to the `/admin/accounts` UI ([tribela](https://github.com/mastodon/mastodon/pull/21282))
|
- Add “disabled” account filter to the `/admin/accounts` UI ([tribela](https://github.com/mastodon/mastodon/pull/21282))
|
||||||
- Add transparency to modal background for accessibility ([edent](https://github.com/mastodon/mastodon/pull/18081))
|
- Add transparency to modal background for accessibility ([edent](https://github.com/mastodon/mastodon/pull/18081))
|
||||||
|
- Add `lang` attribute to image description textarea and poll option field ([c960657](https://github.com/mastodon/mastodon/pull/23293))
|
||||||
|
- Add `spellcheck` attribute to Content Warning and poll option input fields ([c960657](https://github.com/mastodon/mastodon/pull/23395))
|
||||||
- Add `title` attribute to video elements in media attachments ([bramus](https://github.com/mastodon/mastodon/pull/21420))
|
- Add `title` attribute to video elements in media attachments ([bramus](https://github.com/mastodon/mastodon/pull/21420))
|
||||||
- Add left and right margins to emojis ([dsblank](https://github.com/mastodon/mastodon/pull/20464))
|
- Add left and right margins to emojis ([dsblank](https://github.com/mastodon/mastodon/pull/20464))
|
||||||
|
- Add `roles` attribute to `Account` entities in REST API ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23255), [tribela](https://github.com/mastodon/mastodon/pull/23428))
|
||||||
- Add `reading:autoplay:gifs` to `/api/v1/preferences` ([j-f1](https://github.com/mastodon/mastodon/pull/22706))
|
- Add `reading:autoplay:gifs` to `/api/v1/preferences` ([j-f1](https://github.com/mastodon/mastodon/pull/22706))
|
||||||
- Add `hide_collections` parameter to `/api/v1/accounts/credentials` ([CarlSchwan](https://github.com/mastodon/mastodon/pull/22790))
|
- Add `hide_collections` parameter to `/api/v1/accounts/credentials` ([CarlSchwan](https://github.com/mastodon/mastodon/pull/22790))
|
||||||
- Add `policy` attribute to web push subscription objects in `/api/v1/push/subscriptions` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23210))
|
- Add `policy` attribute to web push subscription objects in REST API at `/api/v1/push/subscriptions` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23210))
|
||||||
|
- Add metrics endpoint to streaming API ([Gargron](https://github.com/mastodon/mastodon/pull/23388), [Gargron](https://github.com/mastodon/mastodon/pull/23469))
|
||||||
- Add more specific error messages to HTTP signature verification ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21617))
|
- Add more specific error messages to HTTP signature verification ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21617))
|
||||||
- Add Storj DCS to cloud object storage options in the `mastodon:setup` rake task ([jtolio](https://github.com/mastodon/mastodon/pull/21929))
|
- Add Storj DCS to cloud object storage options in the `mastodon:setup` rake task ([jtolio](https://github.com/mastodon/mastodon/pull/21929))
|
||||||
- Add checkmark symbol in the checkbox for sensitive media ([sidp](https://github.com/mastodon/mastodon/pull/22795))
|
- Add checkmark symbol in the checkbox for sensitive media ([sidp](https://github.com/mastodon/mastodon/pull/22795))
|
||||||
|
@ -67,8 +80,13 @@ All notable changes to this project will be documented in this file.
|
||||||
- Change confirm prompts for relationships management ([tribela](https://github.com/mastodon/mastodon/pull/19411))
|
- Change confirm prompts for relationships management ([tribela](https://github.com/mastodon/mastodon/pull/19411))
|
||||||
- Change language surrounding disability in prompts for media descriptions ([hs4man21](https://github.com/mastodon/mastodon/pull/20923))
|
- Change language surrounding disability in prompts for media descriptions ([hs4man21](https://github.com/mastodon/mastodon/pull/20923))
|
||||||
- Change confusing wording in the sign in banner ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22490))
|
- Change confusing wording in the sign in banner ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22490))
|
||||||
|
- Change `POST /settings/applications/:id` to regenerate token on scopes change ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23359))
|
||||||
- Change account moderation notes to make links clickable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22553))
|
- Change account moderation notes to make links clickable ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22553))
|
||||||
|
- Change link previews for statuses to never use avatar as fallback ([Gargron](https://github.com/mastodon/mastodon/pull/23376))
|
||||||
- Change email address input to be read-only for logged-in users when requesting a new confirmation e-mail ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23247))
|
- Change email address input to be read-only for logged-in users when requesting a new confirmation e-mail ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23247))
|
||||||
|
- Change notifications per page from 15 to 40 in REST API ([Gargron](https://github.com/mastodon/mastodon/pull/23348))
|
||||||
|
- Change number of stored items in home feed from 400 to 800 ([Gargron](https://github.com/mastodon/mastodon/pull/23349))
|
||||||
|
- Change API rate limits from 300/5min per user to 1500/5min per user, 300/5min per app ([Gargron](https://github.com/mastodon/mastodon/pull/23347))
|
||||||
- Save avatar or header correctly even if the other one fails ([tribela](https://github.com/mastodon/mastodon/pull/18465))
|
- Save avatar or header correctly even if the other one fails ([tribela](https://github.com/mastodon/mastodon/pull/18465))
|
||||||
- Change `referrer-policy` to `same-origin` application-wide ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23014), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/23037))
|
- Change `referrer-policy` to `same-origin` application-wide ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23014), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/23037))
|
||||||
- Add 'private' to `Cache-Control`, match Rails expectations ([daxtens](https://github.com/mastodon/mastodon/pull/20608))
|
- Add 'private' to `Cache-Control`, match Rails expectations ([daxtens](https://github.com/mastodon/mastodon/pull/20608))
|
||||||
|
@ -88,7 +106,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Allow adding relays in secure mode and limited federation mode ([ineffyble](https://github.com/mastodon/mastodon/pull/22324))
|
- Allow adding relays in secure mode and limited federation mode ([ineffyble](https://github.com/mastodon/mastodon/pull/22324))
|
||||||
- Change timestamps to be displayed using the user's timezone throughout the moderation interface ([FrancisMurillo](https://github.com/mastodon/mastodon/pull/21878), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/22555))
|
- Change timestamps to be displayed using the user's timezone throughout the moderation interface ([FrancisMurillo](https://github.com/mastodon/mastodon/pull/21878), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/22555))
|
||||||
- Change CSP directives on API to be tight and concise ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20960))
|
- Change CSP directives on API to be tight and concise ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20960))
|
||||||
- Change web UI to not autofocus the compose form ([raboof](https://github.com/mastodon/mastodon/pull/16517))
|
- Change web UI to not autofocus the compose form ([raboof](https://github.com/mastodon/mastodon/pull/16517), [Akkiesoft](https://github.com/mastodon/mastodon/pull/23094))
|
||||||
- Change idempotency key handling for posting when database access is slow ([lambda](https://github.com/mastodon/mastodon/pull/21840))
|
- Change idempotency key handling for posting when database access is slow ([lambda](https://github.com/mastodon/mastodon/pull/21840))
|
||||||
- Change remote media files to be downloaded outside of transactions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21796))
|
- Change remote media files to be downloaded outside of transactions ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21796))
|
||||||
- Improve contrast of charts in “poll has ended” notifications ([j-f1](https://github.com/mastodon/mastodon/pull/22575))
|
- Improve contrast of charts in “poll has ended” notifications ([j-f1](https://github.com/mastodon/mastodon/pull/22575))
|
||||||
|
@ -101,31 +119,38 @@ All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
- Officially remove support for Ruby 2.6 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21477))
|
- Officially remove support for Ruby 2.6 ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21477))
|
||||||
- Remove `object-fit` polyfill used for old versions of Microsoft Edge ([shuuji3](https://github.com/mastodon/mastodon/pull/22693))
|
- Remove `object-fit` polyfill used for old versions of Microsoft Edge ([shuuji3](https://github.com/mastodon/mastodon/pull/22693))
|
||||||
|
- Remove `intersection-observer` polyfill for old Safari support ([shuuji3](https://github.com/mastodon/mastodon/pull/23284))
|
||||||
- Remove empty `title` tag from mailer layout ([nametoolong](https://github.com/mastodon/mastodon/pull/23078))
|
- Remove empty `title` tag from mailer layout ([nametoolong](https://github.com/mastodon/mastodon/pull/23078))
|
||||||
|
- Remove post count and last posts from ActivityPub representation of hashtag collections ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23460))
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
||||||
- **Fix changing domain block severity not undoing individual account effects** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22135))
|
- **Fix changing domain block severity not undoing individual account effects** ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22135))
|
||||||
- Fix suspension worker crashing on S3-compatible setups without ACL support ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22487))
|
- Fix suspension worker crashing on S3-compatible setups without ACL support ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22487))
|
||||||
- Fix possible race conditions when suspending/unsuspending accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22363))
|
- Fix possible race conditions when suspending/unsuspending accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22363))
|
||||||
- Fix being stuck in edit mode when deleting the edited status ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22126))
|
- Fix being stuck in edit mode when deleting the edited posts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22126))
|
||||||
|
- Fix attached media uploads not being cleared when replying to a post ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23504))
|
||||||
- Fix filters not being applied to some notification types ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23211))
|
- Fix filters not being applied to some notification types ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23211))
|
||||||
|
- Fix incorrect link in push notifications for some event types ([elizabeth-dev](https://github.com/mastodon/mastodon/pull/23286))
|
||||||
- Fix some performance issues with `/admin/instances` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21907))
|
- Fix some performance issues with `/admin/instances` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21907))
|
||||||
- Fix some pre-4.0 admin audit logs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22091))
|
- Fix some pre-4.0 admin audit logs ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22091))
|
||||||
- Fix moderation audit log items for warnings having incorrect links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23242))
|
- Fix moderation audit log items for warnings having incorrect links ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23242))
|
||||||
- Fix account activation being sometimes triggered before email confirmation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23245))
|
- Fix account activation being sometimes triggered before email confirmation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23245))
|
||||||
- Fix missing OAuth scopes for admin APIs ([trwnh](https://github.com/mastodon/mastodon/pull/20918), [trwnh](https://github.com/mastodon/mastodon/pull/20979))
|
- Fix missing OAuth scopes for admin APIs ([trwnh](https://github.com/mastodon/mastodon/pull/20918), [trwnh](https://github.com/mastodon/mastodon/pull/20979))
|
||||||
- Fix voter count not being cleared when a poll is reset ([afontenot](https://github.com/mastodon/mastodon/pull/21700))
|
- Fix voter count not being cleared when a poll is reset ([afontenot](https://github.com/mastodon/mastodon/pull/21700))
|
||||||
- Fix attachments of edited statuses not being fetched ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21565))
|
- Fix attachments of edited posts not being fetched ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21565))
|
||||||
- Fix irreversible and whole_word parameters handling in `/api/v1/filters` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21988))
|
- Fix irreversible and whole_word parameters handling in `/api/v1/filters` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21988))
|
||||||
- Fix 500 error when marking posts as sensitive while some of them are deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22134))
|
- Fix 500 error when marking posts as sensitive while some of them are deleted ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22134))
|
||||||
- Fix expanded statuses not always being scrolled into view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21797))
|
- Fix expanded posts not always being scrolled into view ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21797))
|
||||||
- Fix not being able to scroll the remote interaction modal on small screens ([xendke](https://github.com/mastodon/mastodon/pull/21763))
|
- Fix not being able to scroll the remote interaction modal on small screens ([xendke](https://github.com/mastodon/mastodon/pull/21763))
|
||||||
|
- Fix not being able to scroll in post history modal ([cadars](https://github.com/mastodon/mastodon/pull/23396))
|
||||||
- Fix audio player volume control on Safari ([minacle](https://github.com/mastodon/mastodon/pull/23187))
|
- Fix audio player volume control on Safari ([minacle](https://github.com/mastodon/mastodon/pull/23187))
|
||||||
- Fix disappearing “Explore” tabs on Safari ([nyura](https://github.com/mastodon/mastodon/pull/20917), [ykzts](https://github.com/mastodon/mastodon/pull/20982))
|
- Fix disappearing “Explore” tabs on Safari ([nyura](https://github.com/mastodon/mastodon/pull/20917), [ykzts](https://github.com/mastodon/mastodon/pull/20982))
|
||||||
- Fix wrong padding in RTL layout ([Gargron](https://github.com/mastodon/mastodon/pull/23157))
|
- Fix wrong padding in RTL layout ([Gargron](https://github.com/mastodon/mastodon/pull/23157))
|
||||||
- Fix drag & drop upload area display in single-column mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23217))
|
- Fix drag & drop upload area display in single-column mode ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23217))
|
||||||
- Fix being unable to get a single EmailDomainBlock from the admin API ([trwnh](https://github.com/mastodon/mastodon/pull/20846))
|
- Fix being unable to get a single EmailDomainBlock from the admin API ([trwnh](https://github.com/mastodon/mastodon/pull/20846))
|
||||||
|
- Fix admin-set follow recommandations being case-sensitive ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23500))
|
||||||
|
- Fix unserialized `role` on account entities in admin API ([Gargron](https://github.com/mastodon/mastodon/pull/23290))
|
||||||
- Fix pagination of followed tags ([trwnh](https://github.com/mastodon/mastodon/pull/20861))
|
- Fix pagination of followed tags ([trwnh](https://github.com/mastodon/mastodon/pull/20861))
|
||||||
- Fix dropdown menu positions when scrolling ([sidp](https://github.com/mastodon/mastodon/pull/22916), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/23062))
|
- Fix dropdown menu positions when scrolling ([sidp](https://github.com/mastodon/mastodon/pull/22916), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/23062))
|
||||||
- Fix email with empty domain name labels passing validation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23246))
|
- Fix email with empty domain name labels passing validation ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23246))
|
||||||
|
@ -136,9 +161,11 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix error in `VerifyLinkService` when processing links with invalid URLs ([untitaker](https://github.com/mastodon/mastodon/pull/23204))
|
- Fix error in `VerifyLinkService` when processing links with invalid URLs ([untitaker](https://github.com/mastodon/mastodon/pull/23204))
|
||||||
- Fix media uploads with FFmpeg 5 ([dead10ck](https://github.com/mastodon/mastodon/pull/21191))
|
- Fix media uploads with FFmpeg 5 ([dead10ck](https://github.com/mastodon/mastodon/pull/21191))
|
||||||
- Fix sensitive flag not being set when replying to a post with a content warning under certain conditions ([kedamaDQ](https://github.com/mastodon/mastodon/pull/21724))
|
- Fix sensitive flag not being set when replying to a post with a content warning under certain conditions ([kedamaDQ](https://github.com/mastodon/mastodon/pull/21724))
|
||||||
- Fix “Share @user's profile” profile menu item not working ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21490))
|
- Fix misleading message briefly showing up when loading follow requests under some conditions ([c960657](https://github.com/mastodon/mastodon/pull/23386))
|
||||||
|
- Fix “Share @:user's profile” profile menu item not working ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21490))
|
||||||
- Fix crash and incorrect behavior in `tootctl domains crawl` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19004))
|
- Fix crash and incorrect behavior in `tootctl domains crawl` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19004))
|
||||||
- Fix autoplay on iOS ([jamesadney](https://github.com/mastodon/mastodon/pull/21422))
|
- Fix autoplay on iOS ([jamesadney](https://github.com/mastodon/mastodon/pull/21422))
|
||||||
|
- Fix user clean-up scheduler crash when an unconfirmed account has a moderation note ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23318))
|
||||||
- Fix spaces not being stripped in admin account search ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21324))
|
- Fix spaces not being stripped in admin account search ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21324))
|
||||||
- Fix spaces not being stripped when adding relays ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22655))
|
- Fix spaces not being stripped when adding relays ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22655))
|
||||||
- Fix infinite loading spinner instead of soft 404 for non-existing remote accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21303))
|
- Fix infinite loading spinner instead of soft 404 for non-existing remote accounts ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21303))
|
||||||
|
@ -148,8 +175,10 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix UI header overflowing on mobile ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21783))
|
- Fix UI header overflowing on mobile ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21783))
|
||||||
- Fix 500 error when trying to migrate to an invalid address ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21462))
|
- Fix 500 error when trying to migrate to an invalid address ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/21462))
|
||||||
- Fix crash when trying to fetch unobtainable avatar of user using external authentication ([lochiiconnectivity](https://github.com/mastodon/mastodon/pull/22462))
|
- Fix crash when trying to fetch unobtainable avatar of user using external authentication ([lochiiconnectivity](https://github.com/mastodon/mastodon/pull/22462))
|
||||||
- Fix potential duplicate statuses in Explore tab ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22121))
|
- Fix processing error on incoming malformed JSON-LD under some situations ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23416))
|
||||||
|
- Fix potential duplicate posts in Explore tab ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22121))
|
||||||
- Fix deprecation warning in `tootctl accounts rotate` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22120))
|
- Fix deprecation warning in `tootctl accounts rotate` ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22120))
|
||||||
|
- Fix styling of featured tags in light theme ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/23252))
|
||||||
- Fix missing style in warning and strike cards ([AtelierSnek](https://github.com/mastodon/mastodon/pull/22177), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/22302))
|
- Fix missing style in warning and strike cards ([AtelierSnek](https://github.com/mastodon/mastodon/pull/22177), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/22302))
|
||||||
- Fix wasteful request to `/api/v1/custom_emojis` when not logged in ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22326))
|
- Fix wasteful request to `/api/v1/custom_emojis` when not logged in ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22326))
|
||||||
- Fix replies sometimes being delivered to user-blocked domains ([tribela](https://github.com/mastodon/mastodon/pull/22117))
|
- Fix replies sometimes being delivered to user-blocked domains ([tribela](https://github.com/mastodon/mastodon/pull/22117))
|
||||||
|
@ -167,7 +196,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Fix CSP violation warning by removing inline CSS from SVG logo ([luxiaba](https://github.com/mastodon/mastodon/pull/20814))
|
- Fix CSP violation warning by removing inline CSS from SVG logo ([luxiaba](https://github.com/mastodon/mastodon/pull/20814))
|
||||||
- Fix margin for search field on medium window size ([minacle](https://github.com/mastodon/mastodon/pull/21606))
|
- Fix margin for search field on medium window size ([minacle](https://github.com/mastodon/mastodon/pull/21606))
|
||||||
- Fix search popout scrolling with the page in single-column mode ([rgroothuijsen](https://github.com/mastodon/mastodon/pull/16463))
|
- Fix search popout scrolling with the page in single-column mode ([rgroothuijsen](https://github.com/mastodon/mastodon/pull/16463))
|
||||||
- Fix minor status cache hydration discrepancy ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19879))
|
- Fix minor post cache hydration discrepancy ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/19879))
|
||||||
- Fix `・` detection in hashtags ([parthoghosh24](https://github.com/mastodon/mastodon/pull/22888))
|
- Fix `・` detection in hashtags ([parthoghosh24](https://github.com/mastodon/mastodon/pull/22888))
|
||||||
- Fix hashtag follows bypassing user blocks ([tribela](https://github.com/mastodon/mastodon/pull/22849))
|
- Fix hashtag follows bypassing user blocks ([tribela](https://github.com/mastodon/mastodon/pull/22849))
|
||||||
- Fix moved accounts being incorrectly redirected to account settings when trying to view a remote profile ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22497))
|
- Fix moved accounts being incorrectly redirected to account settings when trying to view a remote profile ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22497))
|
||||||
|
@ -187,6 +216,7 @@ All notable changes to this project will be documented in this file.
|
||||||
- Add `form-action` CSP directive ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20781), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20958), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20962))
|
- Add `form-action` CSP directive ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/20781), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20958), [ClearlyClaire](https://github.com/mastodon/mastodon/pull/20962))
|
||||||
- Fix unbounded recursion in account discovery ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22025))
|
- Fix unbounded recursion in account discovery ([ClearlyClaire](https://github.com/mastodon/mastodon/pull/22025))
|
||||||
- Revoke all authorized applications on password reset ([FrancisMurillo](https://github.com/mastodon/mastodon/pull/21325))
|
- Revoke all authorized applications on password reset ([FrancisMurillo](https://github.com/mastodon/mastodon/pull/21325))
|
||||||
|
- Fix unbounded recursion in post discovery ([ClearlyClaire,nametoolong](https://github.com/mastodon/mastodon/pull/23506))
|
||||||
|
|
||||||
## [4.0.2] - 2022-11-15
|
## [4.0.2] - 2022-11-15
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
10
Gemfile
10
Gemfile
|
@ -18,7 +18,7 @@ gem 'makara', '~> 0.5'
|
||||||
gem 'pghero'
|
gem 'pghero'
|
||||||
gem 'dotenv-rails', '~> 2.8'
|
gem 'dotenv-rails', '~> 2.8'
|
||||||
|
|
||||||
gem 'aws-sdk-s3', '~> 1.117', require: false
|
gem 'aws-sdk-s3', '~> 1.119', require: false
|
||||||
gem 'fog-core', '<= 2.4.0'
|
gem 'fog-core', '<= 2.4.0'
|
||||||
gem 'fog-openstack', '~> 0.3', require: false
|
gem 'fog-openstack', '~> 0.3', require: false
|
||||||
gem 'kt-paperclip', '~> 7.1'
|
gem 'kt-paperclip', '~> 7.1'
|
||||||
|
@ -26,7 +26,7 @@ gem 'blurhash', '~> 0.1'
|
||||||
|
|
||||||
gem 'active_model_serializers', '~> 0.10'
|
gem 'active_model_serializers', '~> 0.10'
|
||||||
gem 'addressable', '~> 2.8'
|
gem 'addressable', '~> 2.8'
|
||||||
gem 'bootsnap', '~> 1.15.0', require: false
|
gem 'bootsnap', '~> 1.16.0', require: false
|
||||||
gem 'browser'
|
gem 'browser'
|
||||||
gem 'charlock_holmes', '~> 0.7.7'
|
gem 'charlock_holmes', '~> 0.7.7'
|
||||||
gem 'chewy', '~> 7.2'
|
gem 'chewy', '~> 7.2'
|
||||||
|
@ -40,7 +40,7 @@ end
|
||||||
gem 'net-ldap', '~> 0.17'
|
gem 'net-ldap', '~> 0.17'
|
||||||
gem 'omniauth-cas', '~> 2.0'
|
gem 'omniauth-cas', '~> 2.0'
|
||||||
gem 'omniauth-saml', '~> 1.10'
|
gem 'omniauth-saml', '~> 1.10'
|
||||||
gem 'gitlab-omniauth-openid-connect', '~>0.10.0', require: 'omniauth_openid_connect'
|
gem 'gitlab-omniauth-openid-connect', '~>0.10.1', require: 'omniauth_openid_connect'
|
||||||
gem 'omniauth', '~> 1.9'
|
gem 'omniauth', '~> 1.9'
|
||||||
gem 'omniauth-rails_csrf_protection', '~> 0.1'
|
gem 'omniauth-rails_csrf_protection', '~> 0.1'
|
||||||
|
|
||||||
|
@ -73,7 +73,7 @@ gem 'rack-attack', '~> 6.6'
|
||||||
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
|
gem 'rack-cors', '~> 1.1', require: 'rack/cors'
|
||||||
gem 'rails-i18n', '~> 6.0'
|
gem 'rails-i18n', '~> 6.0'
|
||||||
gem 'rails-settings-cached', '~> 0.6'
|
gem 'rails-settings-cached', '~> 0.6'
|
||||||
gem 'redcarpet', '~> 3.5'
|
gem 'redcarpet', '~> 3.6'
|
||||||
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
|
gem 'redis', '~> 4.5', require: ['redis', 'redis/connection/hiredis']
|
||||||
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
gem 'mario-redis-lock', '~> 1.2', require: 'redis_lock'
|
||||||
gem 'rqrcode', '~> 2.1'
|
gem 'rqrcode', '~> 2.1'
|
||||||
|
@ -85,7 +85,7 @@ gem 'sidekiq-scheduler', '~> 4.0'
|
||||||
gem 'sidekiq-unique-jobs', '~> 7.1'
|
gem 'sidekiq-unique-jobs', '~> 7.1'
|
||||||
gem 'sidekiq-bulk', '~> 0.2.0'
|
gem 'sidekiq-bulk', '~> 0.2.0'
|
||||||
gem 'simple-navigation', '~> 4.4'
|
gem 'simple-navigation', '~> 4.4'
|
||||||
gem 'simple_form', '~> 5.1'
|
gem 'simple_form', '~> 5.2'
|
||||||
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
|
gem 'sprockets-rails', '~> 3.4', require: 'sprockets/railtie'
|
||||||
gem 'stoplight', '~> 3.0.1'
|
gem 'stoplight', '~> 3.0.1'
|
||||||
gem 'strong_migrations', '~> 0.7'
|
gem 'strong_migrations', '~> 0.7'
|
||||||
|
|
152
Gemfile.lock
152
Gemfile.lock
|
@ -10,40 +10,40 @@ GIT
|
||||||
GEM
|
GEM
|
||||||
remote: https://rubygems.org/
|
remote: https://rubygems.org/
|
||||||
specs:
|
specs:
|
||||||
actioncable (6.1.7.1)
|
actioncable (6.1.7.2)
|
||||||
actionpack (= 6.1.7.1)
|
actionpack (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
nio4r (~> 2.0)
|
nio4r (~> 2.0)
|
||||||
websocket-driver (>= 0.6.1)
|
websocket-driver (>= 0.6.1)
|
||||||
actionmailbox (6.1.7.1)
|
actionmailbox (6.1.7.2)
|
||||||
actionpack (= 6.1.7.1)
|
actionpack (= 6.1.7.2)
|
||||||
activejob (= 6.1.7.1)
|
activejob (= 6.1.7.2)
|
||||||
activerecord (= 6.1.7.1)
|
activerecord (= 6.1.7.2)
|
||||||
activestorage (= 6.1.7.1)
|
activestorage (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
mail (>= 2.7.1)
|
mail (>= 2.7.1)
|
||||||
actionmailer (6.1.7.1)
|
actionmailer (6.1.7.2)
|
||||||
actionpack (= 6.1.7.1)
|
actionpack (= 6.1.7.2)
|
||||||
actionview (= 6.1.7.1)
|
actionview (= 6.1.7.2)
|
||||||
activejob (= 6.1.7.1)
|
activejob (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
mail (~> 2.5, >= 2.5.4)
|
mail (~> 2.5, >= 2.5.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
actionpack (6.1.7.1)
|
actionpack (6.1.7.2)
|
||||||
actionview (= 6.1.7.1)
|
actionview (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
rack (~> 2.0, >= 2.0.9)
|
rack (~> 2.0, >= 2.0.9)
|
||||||
rack-test (>= 0.6.3)
|
rack-test (>= 0.6.3)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
rails-html-sanitizer (~> 1.0, >= 1.2.0)
|
||||||
actiontext (6.1.7.1)
|
actiontext (6.1.7.2)
|
||||||
actionpack (= 6.1.7.1)
|
actionpack (= 6.1.7.2)
|
||||||
activerecord (= 6.1.7.1)
|
activerecord (= 6.1.7.2)
|
||||||
activestorage (= 6.1.7.1)
|
activestorage (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
nokogiri (>= 1.8.5)
|
nokogiri (>= 1.8.5)
|
||||||
actionview (6.1.7.1)
|
actionview (6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
builder (~> 3.1)
|
builder (~> 3.1)
|
||||||
erubi (~> 1.4)
|
erubi (~> 1.4)
|
||||||
rails-dom-testing (~> 2.0)
|
rails-dom-testing (~> 2.0)
|
||||||
|
@ -54,22 +54,22 @@ GEM
|
||||||
case_transform (>= 0.2)
|
case_transform (>= 0.2)
|
||||||
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
|
||||||
active_record_query_trace (1.8)
|
active_record_query_trace (1.8)
|
||||||
activejob (6.1.7.1)
|
activejob (6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
globalid (>= 0.3.6)
|
globalid (>= 0.3.6)
|
||||||
activemodel (6.1.7.1)
|
activemodel (6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
activerecord (6.1.7.1)
|
activerecord (6.1.7.2)
|
||||||
activemodel (= 6.1.7.1)
|
activemodel (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
activestorage (6.1.7.1)
|
activestorage (6.1.7.2)
|
||||||
actionpack (= 6.1.7.1)
|
actionpack (= 6.1.7.2)
|
||||||
activejob (= 6.1.7.1)
|
activejob (= 6.1.7.2)
|
||||||
activerecord (= 6.1.7.1)
|
activerecord (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
marcel (~> 1.0)
|
marcel (~> 1.0)
|
||||||
mini_mime (>= 1.1.0)
|
mini_mime (>= 1.1.0)
|
||||||
activesupport (6.1.7.1)
|
activesupport (6.1.7.2)
|
||||||
concurrent-ruby (~> 1.0, >= 1.0.2)
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
||||||
i18n (>= 1.6, < 2)
|
i18n (>= 1.6, < 2)
|
||||||
minitest (>= 5.1)
|
minitest (>= 5.1)
|
||||||
|
@ -90,8 +90,8 @@ GEM
|
||||||
attr_required (1.0.1)
|
attr_required (1.0.1)
|
||||||
awrence (1.2.1)
|
awrence (1.2.1)
|
||||||
aws-eventstream (1.2.0)
|
aws-eventstream (1.2.0)
|
||||||
aws-partitions (1.695.0)
|
aws-partitions (1.701.0)
|
||||||
aws-sdk-core (3.169.0)
|
aws-sdk-core (3.170.0)
|
||||||
aws-eventstream (~> 1, >= 1.0.2)
|
aws-eventstream (~> 1, >= 1.0.2)
|
||||||
aws-partitions (~> 1, >= 1.651.0)
|
aws-partitions (~> 1, >= 1.651.0)
|
||||||
aws-sigv4 (~> 1.5)
|
aws-sigv4 (~> 1.5)
|
||||||
|
@ -99,7 +99,7 @@ GEM
|
||||||
aws-sdk-kms (1.62.0)
|
aws-sdk-kms (1.62.0)
|
||||||
aws-sdk-core (~> 3, >= 3.165.0)
|
aws-sdk-core (~> 3, >= 3.165.0)
|
||||||
aws-sigv4 (~> 1.1)
|
aws-sigv4 (~> 1.1)
|
||||||
aws-sdk-s3 (1.118.0)
|
aws-sdk-s3 (1.119.0)
|
||||||
aws-sdk-core (~> 3, >= 3.165.0)
|
aws-sdk-core (~> 3, >= 3.165.0)
|
||||||
aws-sdk-kms (~> 1)
|
aws-sdk-kms (~> 1)
|
||||||
aws-sigv4 (~> 1.4)
|
aws-sigv4 (~> 1.4)
|
||||||
|
@ -122,7 +122,7 @@ GEM
|
||||||
debug_inspector (>= 0.0.1)
|
debug_inspector (>= 0.0.1)
|
||||||
blurhash (0.1.6)
|
blurhash (0.1.6)
|
||||||
ffi (~> 1.14)
|
ffi (~> 1.14)
|
||||||
bootsnap (1.15.0)
|
bootsnap (1.16.0)
|
||||||
msgpack (~> 1.2)
|
msgpack (~> 1.2)
|
||||||
brakeman (5.4.0)
|
brakeman (5.4.0)
|
||||||
browser (5.3.1)
|
browser (5.3.1)
|
||||||
|
@ -207,7 +207,7 @@ GEM
|
||||||
docile (1.4.0)
|
docile (1.4.0)
|
||||||
domain_name (0.5.20190701)
|
domain_name (0.5.20190701)
|
||||||
unf (>= 0.0.5, < 1.0.0)
|
unf (>= 0.0.5, < 1.0.0)
|
||||||
doorkeeper (5.6.2)
|
doorkeeper (5.6.4)
|
||||||
railties (>= 5)
|
railties (>= 5)
|
||||||
dotenv (2.8.1)
|
dotenv (2.8.1)
|
||||||
dotenv-rails (2.8.1)
|
dotenv-rails (2.8.1)
|
||||||
|
@ -229,7 +229,7 @@ GEM
|
||||||
tzinfo
|
tzinfo
|
||||||
excon (0.97.1)
|
excon (0.97.1)
|
||||||
fabrication (2.30.0)
|
fabrication (2.30.0)
|
||||||
faker (3.1.0)
|
faker (3.1.1)
|
||||||
i18n (>= 1.8.11, < 2)
|
i18n (>= 1.8.11, < 2)
|
||||||
faraday (1.10.3)
|
faraday (1.10.3)
|
||||||
faraday-em_http (~> 1.0)
|
faraday-em_http (~> 1.0)
|
||||||
|
@ -279,11 +279,11 @@ GEM
|
||||||
fuubar (2.5.1)
|
fuubar (2.5.1)
|
||||||
rspec-core (~> 3.0)
|
rspec-core (~> 3.0)
|
||||||
ruby-progressbar (~> 1.4)
|
ruby-progressbar (~> 1.4)
|
||||||
gitlab-omniauth-openid-connect (0.10.0)
|
gitlab-omniauth-openid-connect (0.10.1)
|
||||||
addressable (~> 2.7)
|
addressable (~> 2.7)
|
||||||
omniauth (>= 1.9, < 3)
|
omniauth (>= 1.9, < 3)
|
||||||
openid_connect (~> 1.2)
|
openid_connect (~> 1.2)
|
||||||
globalid (1.0.1)
|
globalid (1.1.0)
|
||||||
activesupport (>= 5.0)
|
activesupport (>= 5.0)
|
||||||
hamlit (3.0.3)
|
hamlit (3.0.3)
|
||||||
temple (>= 0.8.2)
|
temple (>= 0.8.2)
|
||||||
|
@ -427,7 +427,7 @@ GEM
|
||||||
net-protocol
|
net-protocol
|
||||||
net-ssh (7.0.1)
|
net-ssh (7.0.1)
|
||||||
nio4r (2.5.8)
|
nio4r (2.5.8)
|
||||||
nokogiri (1.14.0)
|
nokogiri (1.14.1)
|
||||||
mini_portile2 (~> 2.8.0)
|
mini_portile2 (~> 2.8.0)
|
||||||
racc (~> 1.4)
|
racc (~> 1.4)
|
||||||
nsa (0.2.8)
|
nsa (0.2.8)
|
||||||
|
@ -464,7 +464,7 @@ GEM
|
||||||
openssl-signature_algorithm (1.2.1)
|
openssl-signature_algorithm (1.2.1)
|
||||||
openssl (> 2.0, < 3.1)
|
openssl (> 2.0, < 3.1)
|
||||||
orm_adapter (0.5.0)
|
orm_adapter (0.5.0)
|
||||||
ox (2.14.13)
|
ox (2.14.14)
|
||||||
parallel (1.22.1)
|
parallel (1.22.1)
|
||||||
parser (3.2.0.0)
|
parser (3.2.0.0)
|
||||||
ast (~> 2.4.1)
|
ast (~> 2.4.1)
|
||||||
|
@ -515,20 +515,20 @@ GEM
|
||||||
rack
|
rack
|
||||||
rack-test (2.0.2)
|
rack-test (2.0.2)
|
||||||
rack (>= 1.3)
|
rack (>= 1.3)
|
||||||
rails (6.1.7.1)
|
rails (6.1.7.2)
|
||||||
actioncable (= 6.1.7.1)
|
actioncable (= 6.1.7.2)
|
||||||
actionmailbox (= 6.1.7.1)
|
actionmailbox (= 6.1.7.2)
|
||||||
actionmailer (= 6.1.7.1)
|
actionmailer (= 6.1.7.2)
|
||||||
actionpack (= 6.1.7.1)
|
actionpack (= 6.1.7.2)
|
||||||
actiontext (= 6.1.7.1)
|
actiontext (= 6.1.7.2)
|
||||||
actionview (= 6.1.7.1)
|
actionview (= 6.1.7.2)
|
||||||
activejob (= 6.1.7.1)
|
activejob (= 6.1.7.2)
|
||||||
activemodel (= 6.1.7.1)
|
activemodel (= 6.1.7.2)
|
||||||
activerecord (= 6.1.7.1)
|
activerecord (= 6.1.7.2)
|
||||||
activestorage (= 6.1.7.1)
|
activestorage (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
bundler (>= 1.15.0)
|
bundler (>= 1.15.0)
|
||||||
railties (= 6.1.7.1)
|
railties (= 6.1.7.2)
|
||||||
sprockets-rails (>= 2.0.0)
|
sprockets-rails (>= 2.0.0)
|
||||||
rails-controller-testing (1.0.5)
|
rails-controller-testing (1.0.5)
|
||||||
actionpack (>= 5.0.1.rc1)
|
actionpack (>= 5.0.1.rc1)
|
||||||
|
@ -537,16 +537,16 @@ GEM
|
||||||
rails-dom-testing (2.0.3)
|
rails-dom-testing (2.0.3)
|
||||||
activesupport (>= 4.2.0)
|
activesupport (>= 4.2.0)
|
||||||
nokogiri (>= 1.6)
|
nokogiri (>= 1.6)
|
||||||
rails-html-sanitizer (1.4.4)
|
rails-html-sanitizer (1.5.0)
|
||||||
loofah (~> 2.19, >= 2.19.1)
|
loofah (~> 2.19, >= 2.19.1)
|
||||||
rails-i18n (6.0.0)
|
rails-i18n (6.0.0)
|
||||||
i18n (>= 0.7, < 2)
|
i18n (>= 0.7, < 2)
|
||||||
railties (>= 6.0.0, < 7)
|
railties (>= 6.0.0, < 7)
|
||||||
rails-settings-cached (0.7.2)
|
rails-settings-cached (0.7.2)
|
||||||
rails (>= 4.2.0)
|
rails (>= 4.2.0)
|
||||||
railties (6.1.7.1)
|
railties (6.1.7.2)
|
||||||
actionpack (= 6.1.7.1)
|
actionpack (= 6.1.7.2)
|
||||||
activesupport (= 6.1.7.1)
|
activesupport (= 6.1.7.2)
|
||||||
method_source
|
method_source
|
||||||
rake (>= 12.2)
|
rake (>= 12.2)
|
||||||
thor (~> 1.0)
|
thor (~> 1.0)
|
||||||
|
@ -556,7 +556,7 @@ GEM
|
||||||
link_header (~> 0.0, >= 0.0.8)
|
link_header (~> 0.0, >= 0.0.8)
|
||||||
rdf-normalize (0.5.1)
|
rdf-normalize (0.5.1)
|
||||||
rdf (~> 3.2)
|
rdf (~> 3.2)
|
||||||
redcarpet (3.5.1)
|
redcarpet (3.6.0)
|
||||||
redis (4.8.0)
|
redis (4.8.0)
|
||||||
redis-namespace (1.10.0)
|
redis-namespace (1.10.0)
|
||||||
redis (>= 4)
|
redis (>= 4)
|
||||||
|
@ -597,7 +597,7 @@ GEM
|
||||||
rspec-support (3.12.0)
|
rspec-support (3.12.0)
|
||||||
rspec_junit_formatter (0.6.0)
|
rspec_junit_formatter (0.6.0)
|
||||||
rspec-core (>= 2, < 4, != 2.12.0)
|
rspec-core (>= 2, < 4, != 2.12.0)
|
||||||
rubocop (1.44.0)
|
rubocop (1.44.1)
|
||||||
json (~> 2.3)
|
json (~> 2.3)
|
||||||
parallel (~> 1.10)
|
parallel (~> 1.10)
|
||||||
parser (>= 3.2.0.0)
|
parser (>= 3.2.0.0)
|
||||||
|
@ -611,7 +611,7 @@ GEM
|
||||||
parser (>= 3.1.1.0)
|
parser (>= 3.1.1.0)
|
||||||
rubocop-capybara (2.17.0)
|
rubocop-capybara (2.17.0)
|
||||||
rubocop (~> 1.41)
|
rubocop (~> 1.41)
|
||||||
rubocop-performance (1.15.2)
|
rubocop-performance (1.16.0)
|
||||||
rubocop (>= 1.7.0, < 2.0)
|
rubocop (>= 1.7.0, < 2.0)
|
||||||
rubocop-ast (>= 0.4.0)
|
rubocop-ast (>= 0.4.0)
|
||||||
rubocop-rails (2.17.4)
|
rubocop-rails (2.17.4)
|
||||||
|
@ -630,7 +630,7 @@ GEM
|
||||||
fugit (~> 1.1, >= 1.1.6)
|
fugit (~> 1.1, >= 1.1.6)
|
||||||
safety_net_attestation (0.4.0)
|
safety_net_attestation (0.4.0)
|
||||||
jwt (~> 2.0)
|
jwt (~> 2.0)
|
||||||
sanitize (6.0.0)
|
sanitize (6.0.1)
|
||||||
crass (~> 1.0.2)
|
crass (~> 1.0.2)
|
||||||
nokogiri (>= 1.12.0)
|
nokogiri (>= 1.12.0)
|
||||||
scenic (1.7.0)
|
scenic (1.7.0)
|
||||||
|
@ -656,7 +656,7 @@ GEM
|
||||||
thor (>= 0.20, < 3.0)
|
thor (>= 0.20, < 3.0)
|
||||||
simple-navigation (4.4.0)
|
simple-navigation (4.4.0)
|
||||||
activesupport (>= 2.3.2)
|
activesupport (>= 2.3.2)
|
||||||
simple_form (5.1.0)
|
simple_form (5.2.0)
|
||||||
actionpack (>= 5.2)
|
actionpack (>= 5.2)
|
||||||
activemodel (>= 5.2)
|
activemodel (>= 5.2)
|
||||||
simplecov (0.22.0)
|
simplecov (0.22.0)
|
||||||
|
@ -711,7 +711,7 @@ GEM
|
||||||
twitter-text (3.1.0)
|
twitter-text (3.1.0)
|
||||||
idn-ruby
|
idn-ruby
|
||||||
unf (~> 0.1.0)
|
unf (~> 0.1.0)
|
||||||
tzinfo (2.0.5)
|
tzinfo (2.0.6)
|
||||||
concurrent-ruby (~> 1.0)
|
concurrent-ruby (~> 1.0)
|
||||||
tzinfo-data (1.2022.7)
|
tzinfo-data (1.2022.7)
|
||||||
tzinfo (>= 1.0.0)
|
tzinfo (>= 1.0.0)
|
||||||
|
@ -744,7 +744,7 @@ GEM
|
||||||
addressable (>= 2.8.0)
|
addressable (>= 2.8.0)
|
||||||
crack (>= 0.3.2)
|
crack (>= 0.3.2)
|
||||||
hashdiff (>= 0.4.0, < 2.0.0)
|
hashdiff (>= 0.4.0, < 2.0.0)
|
||||||
webpacker (5.4.3)
|
webpacker (5.4.4)
|
||||||
activesupport (>= 5.2)
|
activesupport (>= 5.2)
|
||||||
rack-proxy (>= 0.6.1)
|
rack-proxy (>= 0.6.1)
|
||||||
railties (>= 5.2)
|
railties (>= 5.2)
|
||||||
|
@ -766,11 +766,11 @@ DEPENDENCIES
|
||||||
active_record_query_trace (~> 1.8)
|
active_record_query_trace (~> 1.8)
|
||||||
addressable (~> 2.8)
|
addressable (~> 2.8)
|
||||||
annotate (~> 3.2)
|
annotate (~> 3.2)
|
||||||
aws-sdk-s3 (~> 1.117)
|
aws-sdk-s3 (~> 1.119)
|
||||||
better_errors (~> 2.9)
|
better_errors (~> 2.9)
|
||||||
binding_of_caller (~> 1.0)
|
binding_of_caller (~> 1.0)
|
||||||
blurhash (~> 0.1)
|
blurhash (~> 0.1)
|
||||||
bootsnap (~> 1.15.0)
|
bootsnap (~> 1.16.0)
|
||||||
brakeman (~> 5.4)
|
brakeman (~> 5.4)
|
||||||
browser
|
browser
|
||||||
bullet (~> 7.0)
|
bullet (~> 7.0)
|
||||||
|
@ -801,7 +801,7 @@ DEPENDENCIES
|
||||||
fog-core (<= 2.4.0)
|
fog-core (<= 2.4.0)
|
||||||
fog-openstack (~> 0.3)
|
fog-openstack (~> 0.3)
|
||||||
fuubar (~> 2.5)
|
fuubar (~> 2.5)
|
||||||
gitlab-omniauth-openid-connect (~> 0.10.0)
|
gitlab-omniauth-openid-connect (~> 0.10.1)
|
||||||
hamlit-rails (~> 0.2)
|
hamlit-rails (~> 0.2)
|
||||||
hcaptcha (~> 7.1)
|
hcaptcha (~> 7.1)
|
||||||
hiredis (~> 0.6)
|
hiredis (~> 0.6)
|
||||||
|
@ -854,7 +854,7 @@ DEPENDENCIES
|
||||||
rails-i18n (~> 6.0)
|
rails-i18n (~> 6.0)
|
||||||
rails-settings-cached (~> 0.6)
|
rails-settings-cached (~> 0.6)
|
||||||
rdf-normalize (~> 0.5)
|
rdf-normalize (~> 0.5)
|
||||||
redcarpet (~> 3.5)
|
redcarpet (~> 3.6)
|
||||||
redis (~> 4.5)
|
redis (~> 4.5)
|
||||||
redis-namespace (~> 1.10)
|
redis-namespace (~> 1.10)
|
||||||
rexml (~> 3.2)
|
rexml (~> 3.2)
|
||||||
|
@ -874,7 +874,7 @@ DEPENDENCIES
|
||||||
sidekiq-scheduler (~> 4.0)
|
sidekiq-scheduler (~> 4.0)
|
||||||
sidekiq-unique-jobs (~> 7.1)
|
sidekiq-unique-jobs (~> 7.1)
|
||||||
simple-navigation (~> 4.4)
|
simple-navigation (~> 4.4)
|
||||||
simple_form (~> 5.1)
|
simple_form (~> 5.2)
|
||||||
simplecov (~> 0.22)
|
simplecov (~> 0.22)
|
||||||
sprockets (~> 3.7.2)
|
sprockets (~> 3.7.2)
|
||||||
sprockets-rails (~> 3.4)
|
sprockets-rails (~> 3.4)
|
||||||
|
|
|
@ -6,7 +6,7 @@ class Api::V1::NotificationsController < Api::BaseController
|
||||||
before_action :require_user!
|
before_action :require_user!
|
||||||
after_action :insert_pagination_headers, only: :index
|
after_action :insert_pagination_headers, only: :index
|
||||||
|
|
||||||
DEFAULT_NOTIFICATIONS_LIMIT = 15
|
DEFAULT_NOTIFICATIONS_LIMIT = 40
|
||||||
|
|
||||||
def index
|
def index
|
||||||
@notifications = load_notifications
|
@notifications = load_notifications
|
||||||
|
|
|
@ -2,10 +2,10 @@
|
||||||
|
|
||||||
class Api::V1::StreamingController < Api::BaseController
|
class Api::V1::StreamingController < Api::BaseController
|
||||||
def index
|
def index
|
||||||
if Rails.configuration.x.streaming_api_base_url != request.host
|
if Rails.configuration.x.streaming_api_base_url == request.host
|
||||||
redirect_to streaming_api_url, status: 301
|
|
||||||
else
|
|
||||||
not_found
|
not_found
|
||||||
|
else
|
||||||
|
redirect_to streaming_api_url, status: 301
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -227,7 +227,7 @@ module SignatureVerification
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_header_name(name)
|
def to_header_name(name)
|
||||||
name.split(/-/).map(&:capitalize).join('-')
|
name.split('-').map(&:capitalize).join('-')
|
||||||
end
|
end
|
||||||
|
|
||||||
def missing_required_signature_parameters?
|
def missing_required_signature_parameters?
|
||||||
|
|
|
@ -29,7 +29,13 @@ class Settings::ApplicationsController < Settings::BaseController
|
||||||
|
|
||||||
def update
|
def update
|
||||||
if @application.update(application_params)
|
if @application.update(application_params)
|
||||||
redirect_to settings_applications_path, notice: I18n.t('generic.changes_saved_msg')
|
if @application.scopes_previously_changed?
|
||||||
|
@access_token = current_user.token_for_app(@application)
|
||||||
|
@access_token.destroy
|
||||||
|
redirect_to settings_application_path(@application), notice: I18n.t('applications.token_regenerated')
|
||||||
|
else
|
||||||
|
redirect_to settings_application_path(@application), notice: I18n.t('generic.changes_saved_msg')
|
||||||
|
end
|
||||||
else
|
else
|
||||||
render :show
|
render :show
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,7 +11,7 @@ class TagsController < ApplicationController
|
||||||
before_action :authenticate_user!, if: :whitelist_mode?
|
before_action :authenticate_user!, if: :whitelist_mode?
|
||||||
before_action :set_local
|
before_action :set_local
|
||||||
before_action :set_tag
|
before_action :set_tag
|
||||||
before_action :set_statuses
|
before_action :set_statuses, if: -> { request.format == :rss }
|
||||||
before_action :set_instance_presenter
|
before_action :set_instance_presenter
|
||||||
|
|
||||||
skip_before_action :require_functional!, unless: :whitelist_mode?
|
skip_before_action :require_functional!, unless: :whitelist_mode?
|
||||||
|
@ -44,12 +44,7 @@ class TagsController < ApplicationController
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_statuses
|
def set_statuses
|
||||||
case request.format&.to_sym
|
@statuses = cache_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
|
||||||
when :json
|
|
||||||
@statuses = cache_collection(TagFeed.new(@tag, current_account, local: @local).get(PAGE_SIZE, params[:max_id], params[:since_id], params[:min_id]), Status)
|
|
||||||
when :rss
|
|
||||||
@statuses = cache_collection(TagFeed.new(@tag, nil, local: @local).get(limit_param), Status)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def set_instance_presenter
|
def set_instance_presenter
|
||||||
|
@ -64,8 +59,6 @@ class TagsController < ApplicationController
|
||||||
ActivityPub::CollectionPresenter.new(
|
ActivityPub::CollectionPresenter.new(
|
||||||
id: tag_url(@tag),
|
id: tag_url(@tag),
|
||||||
type: :ordered,
|
type: :ordered,
|
||||||
size: @tag.statuses.count,
|
|
||||||
items: @statuses.map { |status| ActivityPub::TagManager.instance.uri_for(status) }
|
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -67,7 +67,7 @@ module ApplicationHelper
|
||||||
def link_to_login(name = nil, html_options = nil, &block)
|
def link_to_login(name = nil, html_options = nil, &block)
|
||||||
target = new_user_session_path
|
target = new_user_session_path
|
||||||
|
|
||||||
html_options = name if block_given?
|
html_options = name if block
|
||||||
|
|
||||||
if omniauth_only? && Devise.mappings[:user].omniauthable? && User.omniauth_providers.size == 1
|
if omniauth_only? && Devise.mappings[:user].omniauthable? && User.omniauth_providers.size == 1
|
||||||
target = omniauth_authorize_path(:user, User.omniauth_providers[0])
|
target = omniauth_authorize_path(:user, User.omniauth_providers[0])
|
||||||
|
@ -75,7 +75,7 @@ module ApplicationHelper
|
||||||
html_options[:method] = :post
|
html_options[:method] = :post
|
||||||
end
|
end
|
||||||
|
|
||||||
if block_given?
|
if block
|
||||||
link_to(target, html_options, &block)
|
link_to(target, html_options, &block)
|
||||||
else
|
else
|
||||||
link_to(name, target, html_options)
|
link_to(name, target, html_options)
|
||||||
|
|
|
@ -7,7 +7,7 @@ module EmailHelper
|
||||||
|
|
||||||
def email_to_canonical_email(str)
|
def email_to_canonical_email(str)
|
||||||
username, domain = str.downcase.split('@', 2)
|
username, domain = str.downcase.split('@', 2)
|
||||||
username, = username.gsub('.', '').split('+', 2)
|
username, = username.delete('.').split('+', 2)
|
||||||
|
|
||||||
"#{username}@#{domain}"
|
"#{username}@#{domain}"
|
||||||
end
|
end
|
||||||
|
|
|
@ -213,7 +213,7 @@ module JsonLdHelper
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def load_jsonld_context(url, _options = {}, &_block)
|
def load_jsonld_context(url, _options = {}, &block)
|
||||||
json = Rails.cache.fetch("jsonld:context:#{url}", expires_in: 30.days, raw: true) do
|
json = Rails.cache.fetch("jsonld:context:#{url}", expires_in: 30.days, raw: true) do
|
||||||
request = Request.new(:get, url)
|
request = Request.new(:get, url)
|
||||||
request.add_headers('Accept' => 'application/ld+json')
|
request.add_headers('Accept' => 'application/ld+json')
|
||||||
|
@ -226,6 +226,6 @@ module JsonLdHelper
|
||||||
|
|
||||||
doc = JSON::LD::API::RemoteDocument.new(json, documentUrl: url)
|
doc = JSON::LD::API::RemoteDocument.new(json, documentUrl: url)
|
||||||
|
|
||||||
block_given? ? yield(doc) : doc
|
block ? yield(doc) : doc
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -199,6 +199,8 @@ module LanguagesHelper
|
||||||
sco: ['Scots', 'Scots'].freeze,
|
sco: ['Scots', 'Scots'].freeze,
|
||||||
sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze,
|
sma: ['Southern Sami', 'Åarjelsaemien Gïele'].freeze,
|
||||||
smj: ['Lule Sami', 'Julevsámegiella'].freeze,
|
smj: ['Lule Sami', 'Julevsámegiella'].freeze,
|
||||||
|
szl: ['Silesian', 'ślůnsko godka'].freeze,
|
||||||
|
tai: ['Tai', 'ภาษาไท or ภาษาไต'].freeze,
|
||||||
tok: ['Toki Pona', 'toki pona'].freeze,
|
tok: ['Toki Pona', 'toki pona'].freeze,
|
||||||
zba: ['Balaibalan', 'باليبلن'].freeze,
|
zba: ['Balaibalan', 'باليبلن'].freeze,
|
||||||
zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze,
|
zgh: ['Standard Moroccan Tamazight', 'ⵜⴰⵎⴰⵣⵉⵖⵜ'].freeze,
|
||||||
|
@ -210,8 +212,10 @@ module LanguagesHelper
|
||||||
# names, but for some translations, we need the names of the
|
# names, but for some translations, we need the names of the
|
||||||
# regional variants specifically
|
# regional variants specifically
|
||||||
REGIONAL_LOCALE_NAMES = {
|
REGIONAL_LOCALE_NAMES = {
|
||||||
|
'en-GB': 'English (British)',
|
||||||
'es-AR': 'Español (Argentina)',
|
'es-AR': 'Español (Argentina)',
|
||||||
'es-MX': 'Español (México)',
|
'es-MX': 'Español (México)',
|
||||||
|
'fr-QC': 'Français (Canadien)',
|
||||||
'pt-BR': 'Português (Brasil)',
|
'pt-BR': 'Português (Brasil)',
|
||||||
'pt-PT': 'Português (Portugal)',
|
'pt-PT': 'Português (Portugal)',
|
||||||
'sr-Latn': 'Srpski (latinica)',
|
'sr-Latn': 'Srpski (latinica)',
|
||||||
|
|
|
@ -15,7 +15,7 @@ window.addEventListener('message', e => {
|
||||||
id: data.id,
|
id: data.id,
|
||||||
height: document.getElementsByTagName('html')[0].scrollHeight,
|
height: document.getElementsByTagName('html')[0].scrollHeight,
|
||||||
}, '*');
|
}, '*');
|
||||||
};
|
}
|
||||||
|
|
||||||
if (['interactive', 'complete'].includes(document.readyState)) {
|
if (['interactive', 'complete'].includes(document.readyState)) {
|
||||||
setEmbedHeight();
|
setEmbedHeight();
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
|
|
||||||
import 'packs/public-path';
|
import 'packs/public-path';
|
||||||
import escapeTextContentForBrowser from 'escape-html';
|
import escapeTextContentForBrowser from 'escape-html';
|
||||||
|
|
||||||
const { delegate } = require('@rails/ujs');
|
const { delegate } = require('@rails/ujs');
|
||||||
|
|
||||||
import emojify from '../mastodon/features/emoji/emoji';
|
import emojify from '../mastodon/features/emoji/emoji';
|
||||||
|
|
||||||
delegate(document, '#account_display_name', 'input', ({ target }) => {
|
delegate(document, '#account_display_name', 'input', ({ target }) => {
|
||||||
|
@ -65,7 +67,7 @@ delegate(document, '.input-copy button', 'click', ({ target }) => {
|
||||||
input.blur();
|
input.blur();
|
||||||
target.parentNode.classList.add('copied');
|
target.parentNode.classList.add('copied');
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
target.parentNode.classList.remove('copied');
|
target.parentNode.classList.remove('copied');
|
||||||
}, 700);
|
}, 700);
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,27 +21,27 @@ export function submitAccountNote() {
|
||||||
dispatch(submitAccountNoteSuccess(response.data));
|
dispatch(submitAccountNoteSuccess(response.data));
|
||||||
}).catch(error => dispatch(submitAccountNoteFail(error)));
|
}).catch(error => dispatch(submitAccountNoteFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitAccountNoteRequest() {
|
export function submitAccountNoteRequest() {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_NOTE_SUBMIT_REQUEST,
|
type: ACCOUNT_NOTE_SUBMIT_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitAccountNoteSuccess(relationship) {
|
export function submitAccountNoteSuccess(relationship) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_NOTE_SUBMIT_SUCCESS,
|
type: ACCOUNT_NOTE_SUBMIT_SUCCESS,
|
||||||
relationship,
|
relationship,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitAccountNoteFail(error) {
|
export function submitAccountNoteFail(error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_NOTE_SUBMIT_FAIL,
|
type: ACCOUNT_NOTE_SUBMIT_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function initEditAccountNote(account) {
|
export function initEditAccountNote(account) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -53,17 +53,17 @@ export function initEditAccountNote(account) {
|
||||||
comment,
|
comment,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function cancelAccountNote() {
|
export function cancelAccountNote() {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_NOTE_CANCEL,
|
type: ACCOUNT_NOTE_CANCEL,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeAccountNoteComment(comment) {
|
export function changeAccountNoteComment(comment) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_NOTE_CHANGE_COMMENT,
|
type: ACCOUNT_NOTE_CHANGE_COMMENT,
|
||||||
comment,
|
comment,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -108,7 +108,7 @@ export function fetchAccount(id) {
|
||||||
dispatch(fetchAccountFail(id, error));
|
dispatch(fetchAccountFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const lookupAccount = acct => (dispatch, getState) => {
|
export const lookupAccount = acct => (dispatch, getState) => {
|
||||||
dispatch(lookupAccountRequest(acct));
|
dispatch(lookupAccountRequest(acct));
|
||||||
|
@ -143,13 +143,13 @@ export function fetchAccountRequest(id) {
|
||||||
type: ACCOUNT_FETCH_REQUEST,
|
type: ACCOUNT_FETCH_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchAccountSuccess() {
|
export function fetchAccountSuccess() {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_FETCH_SUCCESS,
|
type: ACCOUNT_FETCH_SUCCESS,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchAccountFail(id, error) {
|
export function fetchAccountFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -158,7 +158,7 @@ export function fetchAccountFail(id, error) {
|
||||||
error,
|
error,
|
||||||
skipAlert: true,
|
skipAlert: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function followAccount(id, options = { reblogs: true }) {
|
export function followAccount(id, options = { reblogs: true }) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -173,7 +173,7 @@ export function followAccount(id, options = { reblogs: true }) {
|
||||||
dispatch(followAccountFail(error, locked));
|
dispatch(followAccountFail(error, locked));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfollowAccount(id) {
|
export function unfollowAccount(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -185,7 +185,7 @@ export function unfollowAccount(id) {
|
||||||
dispatch(unfollowAccountFail(error));
|
dispatch(unfollowAccountFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function followAccountRequest(id, locked) {
|
export function followAccountRequest(id, locked) {
|
||||||
return {
|
return {
|
||||||
|
@ -194,7 +194,7 @@ export function followAccountRequest(id, locked) {
|
||||||
locked,
|
locked,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function followAccountSuccess(relationship, alreadyFollowing) {
|
export function followAccountSuccess(relationship, alreadyFollowing) {
|
||||||
return {
|
return {
|
||||||
|
@ -203,7 +203,7 @@ export function followAccountSuccess(relationship, alreadyFollowing) {
|
||||||
alreadyFollowing,
|
alreadyFollowing,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function followAccountFail(error, locked) {
|
export function followAccountFail(error, locked) {
|
||||||
return {
|
return {
|
||||||
|
@ -212,7 +212,7 @@ export function followAccountFail(error, locked) {
|
||||||
locked,
|
locked,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfollowAccountRequest(id) {
|
export function unfollowAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
|
@ -220,7 +220,7 @@ export function unfollowAccountRequest(id) {
|
||||||
id,
|
id,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfollowAccountSuccess(relationship, statuses) {
|
export function unfollowAccountSuccess(relationship, statuses) {
|
||||||
return {
|
return {
|
||||||
|
@ -229,7 +229,7 @@ export function unfollowAccountSuccess(relationship, statuses) {
|
||||||
statuses,
|
statuses,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfollowAccountFail(error) {
|
export function unfollowAccountFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -237,7 +237,7 @@ export function unfollowAccountFail(error) {
|
||||||
error,
|
error,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function blockAccount(id) {
|
export function blockAccount(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -250,7 +250,7 @@ export function blockAccount(id) {
|
||||||
dispatch(blockAccountFail(id, error));
|
dispatch(blockAccountFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockAccount(id) {
|
export function unblockAccount(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -262,14 +262,14 @@ export function unblockAccount(id) {
|
||||||
dispatch(unblockAccountFail(id, error));
|
dispatch(unblockAccountFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function blockAccountRequest(id) {
|
export function blockAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_BLOCK_REQUEST,
|
type: ACCOUNT_BLOCK_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function blockAccountSuccess(relationship, statuses) {
|
export function blockAccountSuccess(relationship, statuses) {
|
||||||
return {
|
return {
|
||||||
|
@ -277,35 +277,35 @@ export function blockAccountSuccess(relationship, statuses) {
|
||||||
relationship,
|
relationship,
|
||||||
statuses,
|
statuses,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function blockAccountFail(error) {
|
export function blockAccountFail(error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_BLOCK_FAIL,
|
type: ACCOUNT_BLOCK_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockAccountRequest(id) {
|
export function unblockAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNBLOCK_REQUEST,
|
type: ACCOUNT_UNBLOCK_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockAccountSuccess(relationship) {
|
export function unblockAccountSuccess(relationship) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNBLOCK_SUCCESS,
|
type: ACCOUNT_UNBLOCK_SUCCESS,
|
||||||
relationship,
|
relationship,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockAccountFail(error) {
|
export function unblockAccountFail(error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNBLOCK_FAIL,
|
type: ACCOUNT_UNBLOCK_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
export function muteAccount(id, notifications, duration=0) {
|
export function muteAccount(id, notifications, duration=0) {
|
||||||
|
@ -319,7 +319,7 @@ export function muteAccount(id, notifications, duration=0) {
|
||||||
dispatch(muteAccountFail(id, error));
|
dispatch(muteAccountFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteAccount(id) {
|
export function unmuteAccount(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -331,14 +331,14 @@ export function unmuteAccount(id) {
|
||||||
dispatch(unmuteAccountFail(id, error));
|
dispatch(unmuteAccountFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function muteAccountRequest(id) {
|
export function muteAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_MUTE_REQUEST,
|
type: ACCOUNT_MUTE_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function muteAccountSuccess(relationship, statuses) {
|
export function muteAccountSuccess(relationship, statuses) {
|
||||||
return {
|
return {
|
||||||
|
@ -346,35 +346,35 @@ export function muteAccountSuccess(relationship, statuses) {
|
||||||
relationship,
|
relationship,
|
||||||
statuses,
|
statuses,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function muteAccountFail(error) {
|
export function muteAccountFail(error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_MUTE_FAIL,
|
type: ACCOUNT_MUTE_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteAccountRequest(id) {
|
export function unmuteAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNMUTE_REQUEST,
|
type: ACCOUNT_UNMUTE_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteAccountSuccess(relationship) {
|
export function unmuteAccountSuccess(relationship) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNMUTE_SUCCESS,
|
type: ACCOUNT_UNMUTE_SUCCESS,
|
||||||
relationship,
|
relationship,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteAccountFail(error) {
|
export function unmuteAccountFail(error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNMUTE_FAIL,
|
type: ACCOUNT_UNMUTE_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
export function fetchFollowers(id) {
|
export function fetchFollowers(id) {
|
||||||
|
@ -391,14 +391,14 @@ export function fetchFollowers(id) {
|
||||||
dispatch(fetchFollowersFail(id, error));
|
dispatch(fetchFollowersFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowersRequest(id) {
|
export function fetchFollowersRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWERS_FETCH_REQUEST,
|
type: FOLLOWERS_FETCH_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowersSuccess(id, accounts, next) {
|
export function fetchFollowersSuccess(id, accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -407,7 +407,7 @@ export function fetchFollowersSuccess(id, accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowersFail(id, error) {
|
export function fetchFollowersFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -416,7 +416,7 @@ export function fetchFollowersFail(id, error) {
|
||||||
error,
|
error,
|
||||||
skipNotFound: true,
|
skipNotFound: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowers(id) {
|
export function expandFollowers(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -438,14 +438,14 @@ export function expandFollowers(id) {
|
||||||
dispatch(expandFollowersFail(id, error));
|
dispatch(expandFollowersFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowersRequest(id) {
|
export function expandFollowersRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWERS_EXPAND_REQUEST,
|
type: FOLLOWERS_EXPAND_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowersSuccess(id, accounts, next) {
|
export function expandFollowersSuccess(id, accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -454,7 +454,7 @@ export function expandFollowersSuccess(id, accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowersFail(id, error) {
|
export function expandFollowersFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -462,7 +462,7 @@ export function expandFollowersFail(id, error) {
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowing(id) {
|
export function fetchFollowing(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -478,14 +478,14 @@ export function fetchFollowing(id) {
|
||||||
dispatch(fetchFollowingFail(id, error));
|
dispatch(fetchFollowingFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowingRequest(id) {
|
export function fetchFollowingRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWING_FETCH_REQUEST,
|
type: FOLLOWING_FETCH_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowingSuccess(id, accounts, next) {
|
export function fetchFollowingSuccess(id, accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -494,7 +494,7 @@ export function fetchFollowingSuccess(id, accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowingFail(id, error) {
|
export function fetchFollowingFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -503,7 +503,7 @@ export function fetchFollowingFail(id, error) {
|
||||||
error,
|
error,
|
||||||
skipNotFound: true,
|
skipNotFound: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowing(id) {
|
export function expandFollowing(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -525,14 +525,14 @@ export function expandFollowing(id) {
|
||||||
dispatch(expandFollowingFail(id, error));
|
dispatch(expandFollowingFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowingRequest(id) {
|
export function expandFollowingRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWING_EXPAND_REQUEST,
|
type: FOLLOWING_EXPAND_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowingSuccess(id, accounts, next) {
|
export function expandFollowingSuccess(id, accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -541,7 +541,7 @@ export function expandFollowingSuccess(id, accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowingFail(id, error) {
|
export function expandFollowingFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -549,7 +549,7 @@ export function expandFollowingFail(id, error) {
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchRelationships(accountIds) {
|
export function fetchRelationships(accountIds) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -570,7 +570,7 @@ export function fetchRelationships(accountIds) {
|
||||||
dispatch(fetchRelationshipsFail(error));
|
dispatch(fetchRelationshipsFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchRelationshipsRequest(ids) {
|
export function fetchRelationshipsRequest(ids) {
|
||||||
return {
|
return {
|
||||||
|
@ -578,7 +578,7 @@ export function fetchRelationshipsRequest(ids) {
|
||||||
ids,
|
ids,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchRelationshipsSuccess(relationships) {
|
export function fetchRelationshipsSuccess(relationships) {
|
||||||
return {
|
return {
|
||||||
|
@ -586,7 +586,7 @@ export function fetchRelationshipsSuccess(relationships) {
|
||||||
relationships,
|
relationships,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchRelationshipsFail(error) {
|
export function fetchRelationshipsFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -595,7 +595,7 @@ export function fetchRelationshipsFail(error) {
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
skipNotFound: true,
|
skipNotFound: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowRequests() {
|
export function fetchFollowRequests() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -607,13 +607,13 @@ export function fetchFollowRequests() {
|
||||||
dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null));
|
dispatch(fetchFollowRequestsSuccess(response.data, next ? next.uri : null));
|
||||||
}).catch(error => dispatch(fetchFollowRequestsFail(error)));
|
}).catch(error => dispatch(fetchFollowRequestsFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowRequestsRequest() {
|
export function fetchFollowRequestsRequest() {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUESTS_FETCH_REQUEST,
|
type: FOLLOW_REQUESTS_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowRequestsSuccess(accounts, next) {
|
export function fetchFollowRequestsSuccess(accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -621,14 +621,14 @@ export function fetchFollowRequestsSuccess(accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowRequestsFail(error) {
|
export function fetchFollowRequestsFail(error) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUESTS_FETCH_FAIL,
|
type: FOLLOW_REQUESTS_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowRequests() {
|
export function expandFollowRequests() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -646,13 +646,13 @@ export function expandFollowRequests() {
|
||||||
dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null));
|
dispatch(expandFollowRequestsSuccess(response.data, next ? next.uri : null));
|
||||||
}).catch(error => dispatch(expandFollowRequestsFail(error)));
|
}).catch(error => dispatch(expandFollowRequestsFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowRequestsRequest() {
|
export function expandFollowRequestsRequest() {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUESTS_EXPAND_REQUEST,
|
type: FOLLOW_REQUESTS_EXPAND_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowRequestsSuccess(accounts, next) {
|
export function expandFollowRequestsSuccess(accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -660,14 +660,14 @@ export function expandFollowRequestsSuccess(accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowRequestsFail(error) {
|
export function expandFollowRequestsFail(error) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUESTS_EXPAND_FAIL,
|
type: FOLLOW_REQUESTS_EXPAND_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function authorizeFollowRequest(id) {
|
export function authorizeFollowRequest(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -678,21 +678,21 @@ export function authorizeFollowRequest(id) {
|
||||||
.then(() => dispatch(authorizeFollowRequestSuccess(id)))
|
.then(() => dispatch(authorizeFollowRequestSuccess(id)))
|
||||||
.catch(error => dispatch(authorizeFollowRequestFail(id, error)));
|
.catch(error => dispatch(authorizeFollowRequestFail(id, error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function authorizeFollowRequestRequest(id) {
|
export function authorizeFollowRequestRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
|
type: FOLLOW_REQUEST_AUTHORIZE_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function authorizeFollowRequestSuccess(id) {
|
export function authorizeFollowRequestSuccess(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
|
type: FOLLOW_REQUEST_AUTHORIZE_SUCCESS,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function authorizeFollowRequestFail(id, error) {
|
export function authorizeFollowRequestFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -700,7 +700,7 @@ export function authorizeFollowRequestFail(id, error) {
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
||||||
export function rejectFollowRequest(id) {
|
export function rejectFollowRequest(id) {
|
||||||
|
@ -712,21 +712,21 @@ export function rejectFollowRequest(id) {
|
||||||
.then(() => dispatch(rejectFollowRequestSuccess(id)))
|
.then(() => dispatch(rejectFollowRequestSuccess(id)))
|
||||||
.catch(error => dispatch(rejectFollowRequestFail(id, error)));
|
.catch(error => dispatch(rejectFollowRequestFail(id, error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function rejectFollowRequestRequest(id) {
|
export function rejectFollowRequestRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUEST_REJECT_REQUEST,
|
type: FOLLOW_REQUEST_REJECT_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function rejectFollowRequestSuccess(id) {
|
export function rejectFollowRequestSuccess(id) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOW_REQUEST_REJECT_SUCCESS,
|
type: FOLLOW_REQUEST_REJECT_SUCCESS,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function rejectFollowRequestFail(id, error) {
|
export function rejectFollowRequestFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -734,7 +734,7 @@ export function rejectFollowRequestFail(id, error) {
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pinAccount(id) {
|
export function pinAccount(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -746,7 +746,7 @@ export function pinAccount(id) {
|
||||||
dispatch(pinAccountFail(error));
|
dispatch(pinAccountFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpinAccount(id) {
|
export function unpinAccount(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -758,49 +758,49 @@ export function unpinAccount(id) {
|
||||||
dispatch(unpinAccountFail(error));
|
dispatch(unpinAccountFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pinAccountRequest(id) {
|
export function pinAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_PIN_REQUEST,
|
type: ACCOUNT_PIN_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pinAccountSuccess(relationship) {
|
export function pinAccountSuccess(relationship) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_PIN_SUCCESS,
|
type: ACCOUNT_PIN_SUCCESS,
|
||||||
relationship,
|
relationship,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pinAccountFail(error) {
|
export function pinAccountFail(error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_PIN_FAIL,
|
type: ACCOUNT_PIN_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpinAccountRequest(id) {
|
export function unpinAccountRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNPIN_REQUEST,
|
type: ACCOUNT_UNPIN_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpinAccountSuccess(relationship) {
|
export function unpinAccountSuccess(relationship) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNPIN_SUCCESS,
|
type: ACCOUNT_UNPIN_SUCCESS,
|
||||||
relationship,
|
relationship,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpinAccountFail(error) {
|
export function unpinAccountFail(error) {
|
||||||
return {
|
return {
|
||||||
type: ACCOUNT_UNPIN_FAIL,
|
type: ACCOUNT_UNPIN_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const revealAccount = id => ({
|
export const revealAccount = id => ({
|
||||||
type: ACCOUNT_REVEAL,
|
type: ACCOUNT_REVEAL,
|
||||||
|
@ -811,18 +811,18 @@ export function fetchPinnedAccounts() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
dispatch(fetchPinnedAccountsRequest());
|
dispatch(fetchPinnedAccountsRequest());
|
||||||
|
|
||||||
api(getState).get(`/api/v1/endorsements`, { params: { limit: 0 } }).then(response => {
|
api(getState).get('/api/v1/endorsements', { params: { limit: 0 } }).then(response => {
|
||||||
dispatch(importFetchedAccounts(response.data));
|
dispatch(importFetchedAccounts(response.data));
|
||||||
dispatch(fetchPinnedAccountsSuccess(response.data));
|
dispatch(fetchPinnedAccountsSuccess(response.data));
|
||||||
}).catch(err => dispatch(fetchPinnedAccountsFail(err)));
|
}).catch(err => dispatch(fetchPinnedAccountsFail(err)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedAccountsRequest() {
|
export function fetchPinnedAccountsRequest() {
|
||||||
return {
|
return {
|
||||||
type: PINNED_ACCOUNTS_FETCH_REQUEST,
|
type: PINNED_ACCOUNTS_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedAccountsSuccess(accounts, next) {
|
export function fetchPinnedAccountsSuccess(accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -830,14 +830,14 @@ export function fetchPinnedAccountsSuccess(accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedAccountsFail(error) {
|
export function fetchPinnedAccountsFail(error) {
|
||||||
return {
|
return {
|
||||||
type: PINNED_ACCOUNTS_FETCH_FAIL,
|
type: PINNED_ACCOUNTS_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedAccountsSuggestions(q) {
|
export function fetchPinnedAccountsSuggestions(q) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -853,7 +853,7 @@ export function fetchPinnedAccountsSuggestions(q) {
|
||||||
dispatch(fetchPinnedAccountsSuggestionsReady(q, response.data));
|
dispatch(fetchPinnedAccountsSuggestionsReady(q, response.data));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedAccountsSuggestionsReady(query, accounts) {
|
export function fetchPinnedAccountsSuggestionsReady(query, accounts) {
|
||||||
return {
|
return {
|
||||||
|
@ -861,24 +861,24 @@ export function fetchPinnedAccountsSuggestionsReady(query, accounts) {
|
||||||
query,
|
query,
|
||||||
accounts,
|
accounts,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearPinnedAccountsSuggestions() {
|
export function clearPinnedAccountsSuggestions() {
|
||||||
return {
|
return {
|
||||||
type: PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR,
|
type: PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CLEAR,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changePinnedAccountsSuggestions(value) {
|
export function changePinnedAccountsSuggestions(value) {
|
||||||
return {
|
return {
|
||||||
type: PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE,
|
type: PINNED_ACCOUNTS_EDITOR_SUGGESTIONS_CHANGE,
|
||||||
value,
|
value,
|
||||||
}
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function resetPinnedAccountsEditor() {
|
export function resetPinnedAccountsEditor() {
|
||||||
return {
|
return {
|
||||||
type: PINNED_ACCOUNTS_EDITOR_RESET,
|
type: PINNED_ACCOUNTS_EDITOR_RESET,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
|
|
|
@ -17,13 +17,13 @@ export function dismissAlert(alert) {
|
||||||
type: ALERT_DISMISS,
|
type: ALERT_DISMISS,
|
||||||
alert,
|
alert,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearAlert() {
|
export function clearAlert() {
|
||||||
return {
|
return {
|
||||||
type: ALERT_CLEAR,
|
type: ALERT_CLEAR,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage, message_values = undefined) {
|
export function showAlert(title = messages.unexpectedTitle, message = messages.unexpectedMessage, message_values = undefined) {
|
||||||
return {
|
return {
|
||||||
|
@ -32,7 +32,7 @@ export function showAlert(title = messages.unexpectedTitle, message = messages.u
|
||||||
message,
|
message,
|
||||||
message_values,
|
message_values,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function showAlertForError(error, skipNotFound = false) {
|
export function showAlertForError(error, skipNotFound = false) {
|
||||||
if (error.response) {
|
if (error.response) {
|
||||||
|
|
|
@ -24,13 +24,13 @@ export function fetchBlocks() {
|
||||||
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
}).catch(error => dispatch(fetchBlocksFail(error)));
|
}).catch(error => dispatch(fetchBlocksFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchBlocksRequest() {
|
export function fetchBlocksRequest() {
|
||||||
return {
|
return {
|
||||||
type: BLOCKS_FETCH_REQUEST,
|
type: BLOCKS_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchBlocksSuccess(accounts, next) {
|
export function fetchBlocksSuccess(accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -38,14 +38,14 @@ export function fetchBlocksSuccess(accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchBlocksFail(error) {
|
export function fetchBlocksFail(error) {
|
||||||
return {
|
return {
|
||||||
type: BLOCKS_FETCH_FAIL,
|
type: BLOCKS_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBlocks() {
|
export function expandBlocks() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -64,13 +64,13 @@ export function expandBlocks() {
|
||||||
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
}).catch(error => dispatch(expandBlocksFail(error)));
|
}).catch(error => dispatch(expandBlocksFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBlocksRequest() {
|
export function expandBlocksRequest() {
|
||||||
return {
|
return {
|
||||||
type: BLOCKS_EXPAND_REQUEST,
|
type: BLOCKS_EXPAND_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBlocksSuccess(accounts, next) {
|
export function expandBlocksSuccess(accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -78,14 +78,14 @@ export function expandBlocksSuccess(accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBlocksFail(error) {
|
export function expandBlocksFail(error) {
|
||||||
return {
|
return {
|
||||||
type: BLOCKS_EXPAND_FAIL,
|
type: BLOCKS_EXPAND_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function initBlockModal(account) {
|
export function initBlockModal(account) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
|
|
@ -25,13 +25,13 @@ export function fetchBookmarkedStatuses() {
|
||||||
dispatch(fetchBookmarkedStatusesFail(error));
|
dispatch(fetchBookmarkedStatusesFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchBookmarkedStatusesRequest() {
|
export function fetchBookmarkedStatusesRequest() {
|
||||||
return {
|
return {
|
||||||
type: BOOKMARKED_STATUSES_FETCH_REQUEST,
|
type: BOOKMARKED_STATUSES_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchBookmarkedStatusesSuccess(statuses, next) {
|
export function fetchBookmarkedStatusesSuccess(statuses, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -39,14 +39,14 @@ export function fetchBookmarkedStatusesSuccess(statuses, next) {
|
||||||
statuses,
|
statuses,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchBookmarkedStatusesFail(error) {
|
export function fetchBookmarkedStatusesFail(error) {
|
||||||
return {
|
return {
|
||||||
type: BOOKMARKED_STATUSES_FETCH_FAIL,
|
type: BOOKMARKED_STATUSES_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBookmarkedStatuses() {
|
export function expandBookmarkedStatuses() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -66,13 +66,13 @@ export function expandBookmarkedStatuses() {
|
||||||
dispatch(expandBookmarkedStatusesFail(error));
|
dispatch(expandBookmarkedStatusesFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBookmarkedStatusesRequest() {
|
export function expandBookmarkedStatusesRequest() {
|
||||||
return {
|
return {
|
||||||
type: BOOKMARKED_STATUSES_EXPAND_REQUEST,
|
type: BOOKMARKED_STATUSES_EXPAND_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBookmarkedStatusesSuccess(statuses, next) {
|
export function expandBookmarkedStatusesSuccess(statuses, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -80,11 +80,11 @@ export function expandBookmarkedStatusesSuccess(statuses, next) {
|
||||||
statuses,
|
statuses,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandBookmarkedStatusesFail(error) {
|
export function expandBookmarkedStatusesFail(error) {
|
||||||
return {
|
return {
|
||||||
type: BOOKMARKED_STATUSES_EXPAND_FAIL,
|
type: BOOKMARKED_STATUSES_EXPAND_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ export function initBoostModal(props) {
|
||||||
|
|
||||||
dispatch({
|
dispatch({
|
||||||
type: BOOSTS_INIT_MODAL,
|
type: BOOSTS_INIT_MODAL,
|
||||||
privacy
|
privacy,
|
||||||
});
|
});
|
||||||
|
|
||||||
dispatch(openModal('BOOST', props));
|
dispatch(openModal('BOOST', props));
|
||||||
|
|
|
@ -15,7 +15,7 @@ export function addColumn(id, params) {
|
||||||
|
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function removeColumn(uuid) {
|
export function removeColumn(uuid) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
@ -26,7 +26,7 @@ export function removeColumn(uuid) {
|
||||||
|
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function moveColumn(uuid, direction) {
|
export function moveColumn(uuid, direction) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
@ -38,7 +38,7 @@ export function moveColumn(uuid, direction) {
|
||||||
|
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeColumnParams(uuid, path, value) {
|
export function changeColumnParams(uuid, path, value) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
|
|
@ -101,20 +101,20 @@ export function setComposeToStatus(status, text, spoiler_text, content_type) {
|
||||||
spoiler_text,
|
spoiler_text,
|
||||||
content_type,
|
content_type,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeCompose(text) {
|
export function changeCompose(text) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_CHANGE,
|
type: COMPOSE_CHANGE,
|
||||||
text: text,
|
text: text,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function cycleElefriendCompose() {
|
export function cycleElefriendCompose() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_CYCLE_ELEFRIEND,
|
type: COMPOSE_CYCLE_ELEFRIEND,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function replyCompose(status, routerHistory) {
|
export function replyCompose(status, routerHistory) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -127,19 +127,19 @@ export function replyCompose(status, routerHistory) {
|
||||||
|
|
||||||
ensureComposeIsVisible(getState, routerHistory);
|
ensureComposeIsVisible(getState, routerHistory);
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function cancelReplyCompose() {
|
export function cancelReplyCompose() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_REPLY_CANCEL,
|
type: COMPOSE_REPLY_CANCEL,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function resetCompose() {
|
export function resetCompose() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_RESET,
|
type: COMPOSE_RESET,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function mentionCompose(account, routerHistory) {
|
export function mentionCompose(account, routerHistory) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -150,7 +150,7 @@ export function mentionCompose(account, routerHistory) {
|
||||||
|
|
||||||
ensureComposeIsVisible(getState, routerHistory);
|
ensureComposeIsVisible(getState, routerHistory);
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function directCompose(account, routerHistory) {
|
export function directCompose(account, routerHistory) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -161,7 +161,7 @@ export function directCompose(account, routerHistory) {
|
||||||
|
|
||||||
ensureComposeIsVisible(getState, routerHistory);
|
ensureComposeIsVisible(getState, routerHistory);
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitCompose(routerHistory) {
|
export function submitCompose(routerHistory) {
|
||||||
return function (dispatch, getState) {
|
return function (dispatch, getState) {
|
||||||
|
@ -257,34 +257,34 @@ export function submitCompose(routerHistory) {
|
||||||
dispatch(submitComposeFail(error));
|
dispatch(submitComposeFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitComposeRequest() {
|
export function submitComposeRequest() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_SUBMIT_REQUEST,
|
type: COMPOSE_SUBMIT_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitComposeSuccess(status) {
|
export function submitComposeSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_SUBMIT_SUCCESS,
|
type: COMPOSE_SUBMIT_SUCCESS,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitComposeFail(error) {
|
export function submitComposeFail(error) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_SUBMIT_FAIL,
|
type: COMPOSE_SUBMIT_FAIL,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function doodleSet(options) {
|
export function doodleSet(options) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_DOODLE_SET,
|
type: COMPOSE_DOODLE_SET,
|
||||||
options: options,
|
options: options,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function uploadCompose(files) {
|
export function uploadCompose(files) {
|
||||||
return function (dispatch, getState) {
|
return function (dispatch, getState) {
|
||||||
|
@ -347,9 +347,9 @@ export function uploadCompose(files) {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}).catch(error => dispatch(uploadComposeFail(error)));
|
}).catch(error => dispatch(uploadComposeFail(error)));
|
||||||
};
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const uploadComposeProcessing = () => ({
|
export const uploadComposeProcessing = () => ({
|
||||||
type: COMPOSE_UPLOAD_PROCESSING,
|
type: COMPOSE_UPLOAD_PROCESSING,
|
||||||
|
@ -407,14 +407,14 @@ export function initMediaEditModal(id) {
|
||||||
|
|
||||||
dispatch(openModal('FOCAL_POINT', { id }));
|
dispatch(openModal('FOCAL_POINT', { id }));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function onChangeMediaDescription(description) {
|
export function onChangeMediaDescription(description) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_CHANGE_MEDIA_DESCRIPTION,
|
type: COMPOSE_CHANGE_MEDIA_DESCRIPTION,
|
||||||
description,
|
description,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function onChangeMediaFocus(focusX, focusY) {
|
export function onChangeMediaFocus(focusX, focusY) {
|
||||||
return {
|
return {
|
||||||
|
@ -422,7 +422,7 @@ export function onChangeMediaFocus(focusX, focusY) {
|
||||||
focusX,
|
focusX,
|
||||||
focusY,
|
focusY,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeUploadCompose(id, params) {
|
export function changeUploadCompose(id, params) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -454,14 +454,14 @@ export function changeUploadCompose(id, params) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeUploadComposeRequest() {
|
export function changeUploadComposeRequest() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_UPLOAD_CHANGE_REQUEST,
|
type: COMPOSE_UPLOAD_CHANGE_REQUEST,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeUploadComposeSuccess(media, attached) {
|
export function changeUploadComposeSuccess(media, attached) {
|
||||||
return {
|
return {
|
||||||
|
@ -470,7 +470,7 @@ export function changeUploadComposeSuccess(media, attached) {
|
||||||
attached: attached,
|
attached: attached,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeUploadComposeFail(error) {
|
export function changeUploadComposeFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -478,14 +478,14 @@ export function changeUploadComposeFail(error) {
|
||||||
error: error,
|
error: error,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function uploadComposeRequest() {
|
export function uploadComposeRequest() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_UPLOAD_REQUEST,
|
type: COMPOSE_UPLOAD_REQUEST,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function uploadComposeProgress(loaded, total) {
|
export function uploadComposeProgress(loaded, total) {
|
||||||
return {
|
return {
|
||||||
|
@ -493,7 +493,7 @@ export function uploadComposeProgress(loaded, total) {
|
||||||
loaded: loaded,
|
loaded: loaded,
|
||||||
total: total,
|
total: total,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function uploadComposeSuccess(media, file) {
|
export function uploadComposeSuccess(media, file) {
|
||||||
return {
|
return {
|
||||||
|
@ -502,7 +502,7 @@ export function uploadComposeSuccess(media, file) {
|
||||||
file: file,
|
file: file,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function uploadComposeFail(error) {
|
export function uploadComposeFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -510,14 +510,14 @@ export function uploadComposeFail(error) {
|
||||||
error: error,
|
error: error,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function undoUploadCompose(media_id) {
|
export function undoUploadCompose(media_id) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_UPLOAD_UNDO,
|
type: COMPOSE_UPLOAD_UNDO,
|
||||||
media_id: media_id,
|
media_id: media_id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearComposeSuggestions() {
|
export function clearComposeSuggestions() {
|
||||||
if (fetchComposeSuggestionsAccountsController) {
|
if (fetchComposeSuggestionsAccountsController) {
|
||||||
|
@ -526,7 +526,7 @@ export function clearComposeSuggestions() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_SUGGESTIONS_CLEAR,
|
type: COMPOSE_SUGGESTIONS_CLEAR,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => {
|
const fetchComposeSuggestionsAccounts = throttle((dispatch, getState, token) => {
|
||||||
if (fetchComposeSuggestionsAccountsController) {
|
if (fetchComposeSuggestionsAccountsController) {
|
||||||
|
@ -603,7 +603,7 @@ export function fetchComposeSuggestions(token) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function readyComposeSuggestionsEmojis(token, emojis) {
|
export function readyComposeSuggestionsEmojis(token, emojis) {
|
||||||
return {
|
return {
|
||||||
|
@ -611,7 +611,7 @@ export function readyComposeSuggestionsEmojis(token, emojis) {
|
||||||
token,
|
token,
|
||||||
emojis,
|
emojis,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function readyComposeSuggestionsAccounts(token, accounts) {
|
export function readyComposeSuggestionsAccounts(token, accounts) {
|
||||||
return {
|
return {
|
||||||
|
@ -619,7 +619,7 @@ export function readyComposeSuggestionsAccounts(token, accounts) {
|
||||||
token,
|
token,
|
||||||
accounts,
|
accounts,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const readyComposeSuggestionsTags = (token, tags) => ({
|
export const readyComposeSuggestionsTags = (token, tags) => ({
|
||||||
type: COMPOSE_SUGGESTIONS_READY,
|
type: COMPOSE_SUGGESTIONS_READY,
|
||||||
|
@ -659,7 +659,7 @@ export function selectComposeSuggestion(position, token, suggestion, path) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function updateSuggestionTags(token) {
|
export function updateSuggestionTags(token) {
|
||||||
return {
|
return {
|
||||||
|
@ -707,13 +707,13 @@ export function mountCompose() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_MOUNT,
|
type: COMPOSE_MOUNT,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmountCompose() {
|
export function unmountCompose() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_UNMOUNT,
|
type: COMPOSE_UNMOUNT,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeComposeAdvancedOption(option, value) {
|
export function changeComposeAdvancedOption(option, value) {
|
||||||
return {
|
return {
|
||||||
|
@ -727,7 +727,7 @@ export function changeComposeSensitivity() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_SENSITIVITY_CHANGE,
|
type: COMPOSE_SENSITIVITY_CHANGE,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const changeComposeLanguage = language => ({
|
export const changeComposeLanguage = language => ({
|
||||||
type: COMPOSE_LANGUAGE_CHANGE,
|
type: COMPOSE_LANGUAGE_CHANGE,
|
||||||
|
@ -738,28 +738,28 @@ export function changeComposeSpoilerness() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_SPOILERNESS_CHANGE,
|
type: COMPOSE_SPOILERNESS_CHANGE,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeComposeSpoilerText(text) {
|
export function changeComposeSpoilerText(text) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_SPOILER_TEXT_CHANGE,
|
type: COMPOSE_SPOILER_TEXT_CHANGE,
|
||||||
text,
|
text,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeComposeVisibility(value) {
|
export function changeComposeVisibility(value) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_VISIBILITY_CHANGE,
|
type: COMPOSE_VISIBILITY_CHANGE,
|
||||||
value,
|
value,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeComposeContentType(value) {
|
export function changeComposeContentType(value) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_CONTENT_TYPE_CHANGE,
|
type: COMPOSE_CONTENT_TYPE_CHANGE,
|
||||||
value,
|
value,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function insertEmojiCompose(position, emoji) {
|
export function insertEmojiCompose(position, emoji) {
|
||||||
return {
|
return {
|
||||||
|
@ -767,26 +767,26 @@ export function insertEmojiCompose(position, emoji) {
|
||||||
position,
|
position,
|
||||||
emoji,
|
emoji,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function addPoll() {
|
export function addPoll() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_POLL_ADD,
|
type: COMPOSE_POLL_ADD,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function removePoll() {
|
export function removePoll() {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_POLL_REMOVE,
|
type: COMPOSE_POLL_REMOVE,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function addPollOption(title) {
|
export function addPollOption(title) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_POLL_OPTION_ADD,
|
type: COMPOSE_POLL_OPTION_ADD,
|
||||||
title,
|
title,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changePollOption(index, title) {
|
export function changePollOption(index, title) {
|
||||||
return {
|
return {
|
||||||
|
@ -794,14 +794,14 @@ export function changePollOption(index, title) {
|
||||||
index,
|
index,
|
||||||
title,
|
title,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function removePollOption(index) {
|
export function removePollOption(index) {
|
||||||
return {
|
return {
|
||||||
type: COMPOSE_POLL_OPTION_REMOVE,
|
type: COMPOSE_POLL_OPTION_REMOVE,
|
||||||
index,
|
index,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changePollSettings(expiresIn, isMultiple) {
|
export function changePollSettings(expiresIn, isMultiple) {
|
||||||
return {
|
return {
|
||||||
|
@ -809,4 +809,4 @@ export function changePollSettings(expiresIn, isMultiple) {
|
||||||
expiresIn,
|
expiresIn,
|
||||||
isMultiple,
|
isMultiple,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -14,14 +14,14 @@ export function fetchCustomEmojis() {
|
||||||
dispatch(fetchCustomEmojisFail(error));
|
dispatch(fetchCustomEmojisFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchCustomEmojisRequest() {
|
export function fetchCustomEmojisRequest() {
|
||||||
return {
|
return {
|
||||||
type: CUSTOM_EMOJIS_FETCH_REQUEST,
|
type: CUSTOM_EMOJIS_FETCH_REQUEST,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchCustomEmojisSuccess(custom_emojis) {
|
export function fetchCustomEmojisSuccess(custom_emojis) {
|
||||||
return {
|
return {
|
||||||
|
@ -29,7 +29,7 @@ export function fetchCustomEmojisSuccess(custom_emojis) {
|
||||||
custom_emojis,
|
custom_emojis,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchCustomEmojisFail(error) {
|
export function fetchCustomEmojisFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -37,4 +37,4 @@ export function fetchCustomEmojisFail(error) {
|
||||||
error,
|
error,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -29,14 +29,14 @@ export function blockDomain(domain) {
|
||||||
dispatch(blockDomainFail(domain, err));
|
dispatch(blockDomainFail(domain, err));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function blockDomainRequest(domain) {
|
export function blockDomainRequest(domain) {
|
||||||
return {
|
return {
|
||||||
type: DOMAIN_BLOCK_REQUEST,
|
type: DOMAIN_BLOCK_REQUEST,
|
||||||
domain,
|
domain,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function blockDomainSuccess(domain, accounts) {
|
export function blockDomainSuccess(domain, accounts) {
|
||||||
return {
|
return {
|
||||||
|
@ -44,7 +44,7 @@ export function blockDomainSuccess(domain, accounts) {
|
||||||
domain,
|
domain,
|
||||||
accounts,
|
accounts,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function blockDomainFail(domain, error) {
|
export function blockDomainFail(domain, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -52,7 +52,7 @@ export function blockDomainFail(domain, error) {
|
||||||
domain,
|
domain,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockDomain(domain) {
|
export function unblockDomain(domain) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -66,14 +66,14 @@ export function unblockDomain(domain) {
|
||||||
dispatch(unblockDomainFail(domain, err));
|
dispatch(unblockDomainFail(domain, err));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockDomainRequest(domain) {
|
export function unblockDomainRequest(domain) {
|
||||||
return {
|
return {
|
||||||
type: DOMAIN_UNBLOCK_REQUEST,
|
type: DOMAIN_UNBLOCK_REQUEST,
|
||||||
domain,
|
domain,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockDomainSuccess(domain, accounts) {
|
export function unblockDomainSuccess(domain, accounts) {
|
||||||
return {
|
return {
|
||||||
|
@ -81,7 +81,7 @@ export function unblockDomainSuccess(domain, accounts) {
|
||||||
domain,
|
domain,
|
||||||
accounts,
|
accounts,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unblockDomainFail(domain, error) {
|
export function unblockDomainFail(domain, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -89,7 +89,7 @@ export function unblockDomainFail(domain, error) {
|
||||||
domain,
|
domain,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchDomainBlocks() {
|
export function fetchDomainBlocks() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -102,13 +102,13 @@ export function fetchDomainBlocks() {
|
||||||
dispatch(fetchDomainBlocksFail(err));
|
dispatch(fetchDomainBlocksFail(err));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchDomainBlocksRequest() {
|
export function fetchDomainBlocksRequest() {
|
||||||
return {
|
return {
|
||||||
type: DOMAIN_BLOCKS_FETCH_REQUEST,
|
type: DOMAIN_BLOCKS_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchDomainBlocksSuccess(domains, next) {
|
export function fetchDomainBlocksSuccess(domains, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -116,14 +116,14 @@ export function fetchDomainBlocksSuccess(domains, next) {
|
||||||
domains,
|
domains,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchDomainBlocksFail(error) {
|
export function fetchDomainBlocksFail(error) {
|
||||||
return {
|
return {
|
||||||
type: DOMAIN_BLOCKS_FETCH_FAIL,
|
type: DOMAIN_BLOCKS_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandDomainBlocks() {
|
export function expandDomainBlocks() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -142,13 +142,13 @@ export function expandDomainBlocks() {
|
||||||
dispatch(expandDomainBlocksFail(err));
|
dispatch(expandDomainBlocksFail(err));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandDomainBlocksRequest() {
|
export function expandDomainBlocksRequest() {
|
||||||
return {
|
return {
|
||||||
type: DOMAIN_BLOCKS_EXPAND_REQUEST,
|
type: DOMAIN_BLOCKS_EXPAND_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandDomainBlocksSuccess(domains, next) {
|
export function expandDomainBlocksSuccess(domains, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -156,11 +156,11 @@ export function expandDomainBlocksSuccess(domains, next) {
|
||||||
domains,
|
domains,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandDomainBlocksFail(error) {
|
export function expandDomainBlocksFail(error) {
|
||||||
return {
|
return {
|
||||||
type: DOMAIN_BLOCKS_EXPAND_FAIL,
|
type: DOMAIN_BLOCKS_EXPAND_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -11,4 +11,4 @@ export function useEmoji(emoji) {
|
||||||
|
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -25,14 +25,14 @@ export function fetchFavouritedStatuses() {
|
||||||
dispatch(fetchFavouritedStatusesFail(error));
|
dispatch(fetchFavouritedStatusesFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFavouritedStatusesRequest() {
|
export function fetchFavouritedStatusesRequest() {
|
||||||
return {
|
return {
|
||||||
type: FAVOURITED_STATUSES_FETCH_REQUEST,
|
type: FAVOURITED_STATUSES_FETCH_REQUEST,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFavouritedStatusesSuccess(statuses, next) {
|
export function fetchFavouritedStatusesSuccess(statuses, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -41,7 +41,7 @@ export function fetchFavouritedStatusesSuccess(statuses, next) {
|
||||||
next,
|
next,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFavouritedStatusesFail(error) {
|
export function fetchFavouritedStatusesFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -49,7 +49,7 @@ export function fetchFavouritedStatusesFail(error) {
|
||||||
error,
|
error,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFavouritedStatuses() {
|
export function expandFavouritedStatuses() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -69,13 +69,13 @@ export function expandFavouritedStatuses() {
|
||||||
dispatch(expandFavouritedStatusesFail(error));
|
dispatch(expandFavouritedStatusesFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFavouritedStatusesRequest() {
|
export function expandFavouritedStatusesRequest() {
|
||||||
return {
|
return {
|
||||||
type: FAVOURITED_STATUSES_EXPAND_REQUEST,
|
type: FAVOURITED_STATUSES_EXPAND_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFavouritedStatusesSuccess(statuses, next) {
|
export function expandFavouritedStatusesSuccess(statuses, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -83,11 +83,11 @@ export function expandFavouritedStatusesSuccess(statuses, next) {
|
||||||
statuses,
|
statuses,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFavouritedStatusesFail(error) {
|
export function expandFavouritedStatusesFail(error) {
|
||||||
return {
|
return {
|
||||||
type: FAVOURITED_STATUSES_EXPAND_FAIL,
|
type: FAVOURITED_STATUSES_EXPAND_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -8,10 +8,10 @@ export function setHeight (key, id, height) {
|
||||||
id,
|
id,
|
||||||
height,
|
height,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearHeight () {
|
export function clearHeight () {
|
||||||
return {
|
return {
|
||||||
type: HEIGHT_CACHE_CLEAR,
|
type: HEIGHT_CACHE_CLEAR,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ export function reblog(status, visibility) {
|
||||||
dispatch(reblogFail(status, error));
|
dispatch(reblogFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unreblog(status) {
|
export function unreblog(status) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -77,21 +77,21 @@ export function unreblog(status) {
|
||||||
dispatch(unreblogFail(status, error));
|
dispatch(unreblogFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function reblogRequest(status) {
|
export function reblogRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: REBLOG_REQUEST,
|
type: REBLOG_REQUEST,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function reblogSuccess(status) {
|
export function reblogSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: REBLOG_SUCCESS,
|
type: REBLOG_SUCCESS,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function reblogFail(status, error) {
|
export function reblogFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -99,21 +99,21 @@ export function reblogFail(status, error) {
|
||||||
status: status,
|
status: status,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unreblogRequest(status) {
|
export function unreblogRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: UNREBLOG_REQUEST,
|
type: UNREBLOG_REQUEST,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unreblogSuccess(status) {
|
export function unreblogSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: UNREBLOG_SUCCESS,
|
type: UNREBLOG_SUCCESS,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unreblogFail(status, error) {
|
export function unreblogFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -121,7 +121,7 @@ export function unreblogFail(status, error) {
|
||||||
status: status,
|
status: status,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function favourite(status) {
|
export function favourite(status) {
|
||||||
return function (dispatch, getState) {
|
return function (dispatch, getState) {
|
||||||
|
@ -134,7 +134,7 @@ export function favourite(status) {
|
||||||
dispatch(favouriteFail(status, error));
|
dispatch(favouriteFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfavourite(status) {
|
export function unfavourite(status) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -147,21 +147,21 @@ export function unfavourite(status) {
|
||||||
dispatch(unfavouriteFail(status, error));
|
dispatch(unfavouriteFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function favouriteRequest(status) {
|
export function favouriteRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: FAVOURITE_REQUEST,
|
type: FAVOURITE_REQUEST,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function favouriteSuccess(status) {
|
export function favouriteSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: FAVOURITE_SUCCESS,
|
type: FAVOURITE_SUCCESS,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function favouriteFail(status, error) {
|
export function favouriteFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -169,21 +169,21 @@ export function favouriteFail(status, error) {
|
||||||
status: status,
|
status: status,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfavouriteRequest(status) {
|
export function unfavouriteRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: UNFAVOURITE_REQUEST,
|
type: UNFAVOURITE_REQUEST,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfavouriteSuccess(status) {
|
export function unfavouriteSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: UNFAVOURITE_SUCCESS,
|
type: UNFAVOURITE_SUCCESS,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unfavouriteFail(status, error) {
|
export function unfavouriteFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -191,7 +191,7 @@ export function unfavouriteFail(status, error) {
|
||||||
status: status,
|
status: status,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function bookmark(status) {
|
export function bookmark(status) {
|
||||||
return function (dispatch, getState) {
|
return function (dispatch, getState) {
|
||||||
|
@ -204,7 +204,7 @@ export function bookmark(status) {
|
||||||
dispatch(bookmarkFail(status, error));
|
dispatch(bookmarkFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unbookmark(status) {
|
export function unbookmark(status) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -217,21 +217,21 @@ export function unbookmark(status) {
|
||||||
dispatch(unbookmarkFail(status, error));
|
dispatch(unbookmarkFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function bookmarkRequest(status) {
|
export function bookmarkRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: BOOKMARK_REQUEST,
|
type: BOOKMARK_REQUEST,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function bookmarkSuccess(status) {
|
export function bookmarkSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: BOOKMARK_SUCCESS,
|
type: BOOKMARK_SUCCESS,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function bookmarkFail(status, error) {
|
export function bookmarkFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -239,21 +239,21 @@ export function bookmarkFail(status, error) {
|
||||||
status: status,
|
status: status,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unbookmarkRequest(status) {
|
export function unbookmarkRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: UNBOOKMARK_REQUEST,
|
type: UNBOOKMARK_REQUEST,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unbookmarkSuccess(status) {
|
export function unbookmarkSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: UNBOOKMARK_SUCCESS,
|
type: UNBOOKMARK_SUCCESS,
|
||||||
status: status,
|
status: status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unbookmarkFail(status, error) {
|
export function unbookmarkFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -261,7 +261,7 @@ export function unbookmarkFail(status, error) {
|
||||||
status: status,
|
status: status,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchReblogs(id) {
|
export function fetchReblogs(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -274,14 +274,14 @@ export function fetchReblogs(id) {
|
||||||
dispatch(fetchReblogsFail(id, error));
|
dispatch(fetchReblogsFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchReblogsRequest(id) {
|
export function fetchReblogsRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: REBLOGS_FETCH_REQUEST,
|
type: REBLOGS_FETCH_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchReblogsSuccess(id, accounts) {
|
export function fetchReblogsSuccess(id, accounts) {
|
||||||
return {
|
return {
|
||||||
|
@ -289,14 +289,14 @@ export function fetchReblogsSuccess(id, accounts) {
|
||||||
id,
|
id,
|
||||||
accounts,
|
accounts,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchReblogsFail(id, error) {
|
export function fetchReblogsFail(id, error) {
|
||||||
return {
|
return {
|
||||||
type: REBLOGS_FETCH_FAIL,
|
type: REBLOGS_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFavourites(id) {
|
export function fetchFavourites(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -309,14 +309,14 @@ export function fetchFavourites(id) {
|
||||||
dispatch(fetchFavouritesFail(id, error));
|
dispatch(fetchFavouritesFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFavouritesRequest(id) {
|
export function fetchFavouritesRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: FAVOURITES_FETCH_REQUEST,
|
type: FAVOURITES_FETCH_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFavouritesSuccess(id, accounts) {
|
export function fetchFavouritesSuccess(id, accounts) {
|
||||||
return {
|
return {
|
||||||
|
@ -324,14 +324,14 @@ export function fetchFavouritesSuccess(id, accounts) {
|
||||||
id,
|
id,
|
||||||
accounts,
|
accounts,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFavouritesFail(id, error) {
|
export function fetchFavouritesFail(id, error) {
|
||||||
return {
|
return {
|
||||||
type: FAVOURITES_FETCH_FAIL,
|
type: FAVOURITES_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pin(status) {
|
export function pin(status) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -344,21 +344,21 @@ export function pin(status) {
|
||||||
dispatch(pinFail(status, error));
|
dispatch(pinFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pinRequest(status) {
|
export function pinRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: PIN_REQUEST,
|
type: PIN_REQUEST,
|
||||||
status,
|
status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pinSuccess(status) {
|
export function pinSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: PIN_SUCCESS,
|
type: PIN_SUCCESS,
|
||||||
status,
|
status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function pinFail(status, error) {
|
export function pinFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -366,7 +366,7 @@ export function pinFail(status, error) {
|
||||||
status,
|
status,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpin (status) {
|
export function unpin (status) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -379,21 +379,21 @@ export function unpin (status) {
|
||||||
dispatch(unpinFail(status, error));
|
dispatch(unpinFail(status, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpinRequest(status) {
|
export function unpinRequest(status) {
|
||||||
return {
|
return {
|
||||||
type: UNPIN_REQUEST,
|
type: UNPIN_REQUEST,
|
||||||
status,
|
status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpinSuccess(status) {
|
export function unpinSuccess(status) {
|
||||||
return {
|
return {
|
||||||
type: UNPIN_SUCCESS,
|
type: UNPIN_SUCCESS,
|
||||||
status,
|
status,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unpinFail(status, error) {
|
export function unpinFail(status, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -401,7 +401,7 @@ export function unpinFail(status, error) {
|
||||||
status,
|
status,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const addReaction = (statusId, name, url) => (dispatch, getState) => {
|
export const addReaction = (statusId, name, url) => (dispatch, getState) => {
|
||||||
const status = getState().get('statuses').get(statusId);
|
const status = getState().get('statuses').get(statusId);
|
||||||
|
|
|
@ -33,14 +33,14 @@ export function checkDeprecatedLocalSettings() {
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearDeprecatedLocalSettings() {
|
export function clearDeprecatedLocalSettings() {
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
dispatch(deleteLocalSetting(['content_warnings', 'auto_unfold']));
|
dispatch(deleteLocalSetting(['content_warnings', 'auto_unfold']));
|
||||||
dispatch(deleteLocalSetting(['swipe_to_change_columns']));
|
dispatch(deleteLocalSetting(['swipe_to_change_columns']));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function changeLocalSetting(key, value) {
|
export function changeLocalSetting(key, value) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
@ -52,7 +52,7 @@ export function changeLocalSetting(key, value) {
|
||||||
|
|
||||||
dispatch(saveLocalSettings());
|
dispatch(saveLocalSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteLocalSetting(key) {
|
export function deleteLocalSetting(key) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
@ -63,7 +63,7 @@ export function deleteLocalSetting(key) {
|
||||||
|
|
||||||
dispatch(saveLocalSettings());
|
dispatch(saveLocalSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
// __TODO :__
|
// __TODO :__
|
||||||
// Right now `saveLocalSettings()` doesn't keep track of which user
|
// Right now `saveLocalSettings()` doesn't keep track of which user
|
||||||
|
@ -74,4 +74,4 @@ export function saveLocalSettings() {
|
||||||
const localSettings = getState().get('local_settings').toJS();
|
const localSettings = getState().get('local_settings').toJS();
|
||||||
localStorage.setItem('mastodon-settings', JSON.stringify(localSettings));
|
localStorage.setItem('mastodon-settings', JSON.stringify(localSettings));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -101,7 +101,7 @@ export function submitMarkersSuccess({ home, notifications }) {
|
||||||
home: (home || {}).last_read_id,
|
home: (home || {}).last_read_id,
|
||||||
notifications: (notifications || {}).last_read_id,
|
notifications: (notifications || {}).last_read_id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitMarkers(params = {}) {
|
export function submitMarkers(params = {}) {
|
||||||
const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState);
|
const result = (dispatch, getState) => debouncedSubmitMarkers(dispatch, getState);
|
||||||
|
@ -111,7 +111,7 @@ export function submitMarkers(params = {}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
};
|
}
|
||||||
|
|
||||||
export const fetchMarkers = () => (dispatch, getState) => {
|
export const fetchMarkers = () => (dispatch, getState) => {
|
||||||
const params = { timeline: ['notifications'] };
|
const params = { timeline: ['notifications'] };
|
||||||
|
@ -130,7 +130,7 @@ export function fetchMarkersRequest() {
|
||||||
type: MARKERS_FETCH_REQUEST,
|
type: MARKERS_FETCH_REQUEST,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchMarkersSuccess(markers) {
|
export function fetchMarkersSuccess(markers) {
|
||||||
return {
|
return {
|
||||||
|
@ -138,7 +138,7 @@ export function fetchMarkersSuccess(markers) {
|
||||||
markers,
|
markers,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchMarkersFail(error) {
|
export function fetchMarkersFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -147,4 +147,4 @@ export function fetchMarkersFail(error) {
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
skipAlert: true,
|
skipAlert: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ export function openModal(type, props) {
|
||||||
modalType: type,
|
modalType: type,
|
||||||
modalProps: props,
|
modalProps: props,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function closeModal(type, options = { ignoreFocus: false }) {
|
export function closeModal(type, options = { ignoreFocus: false }) {
|
||||||
return {
|
return {
|
||||||
|
@ -15,4 +15,4 @@ export function closeModal(type, options = { ignoreFocus: false }) {
|
||||||
modalType: type,
|
modalType: type,
|
||||||
ignoreFocus: options.ignoreFocus,
|
ignoreFocus: options.ignoreFocus,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -26,13 +26,13 @@ export function fetchMutes() {
|
||||||
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
}).catch(error => dispatch(fetchMutesFail(error)));
|
}).catch(error => dispatch(fetchMutesFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchMutesRequest() {
|
export function fetchMutesRequest() {
|
||||||
return {
|
return {
|
||||||
type: MUTES_FETCH_REQUEST,
|
type: MUTES_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchMutesSuccess(accounts, next) {
|
export function fetchMutesSuccess(accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -40,14 +40,14 @@ export function fetchMutesSuccess(accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchMutesFail(error) {
|
export function fetchMutesFail(error) {
|
||||||
return {
|
return {
|
||||||
type: MUTES_FETCH_FAIL,
|
type: MUTES_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandMutes() {
|
export function expandMutes() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -66,13 +66,13 @@ export function expandMutes() {
|
||||||
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
dispatch(fetchRelationships(response.data.map(item => item.id)));
|
||||||
}).catch(error => dispatch(expandMutesFail(error)));
|
}).catch(error => dispatch(expandMutesFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandMutesRequest() {
|
export function expandMutesRequest() {
|
||||||
return {
|
return {
|
||||||
type: MUTES_EXPAND_REQUEST,
|
type: MUTES_EXPAND_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandMutesSuccess(accounts, next) {
|
export function expandMutesSuccess(accounts, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -80,14 +80,14 @@ export function expandMutesSuccess(accounts, next) {
|
||||||
accounts,
|
accounts,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandMutesFail(error) {
|
export function expandMutesFail(error) {
|
||||||
return {
|
return {
|
||||||
type: MUTES_EXPAND_FAIL,
|
type: MUTES_EXPAND_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function initMuteModal(account) {
|
export function initMuteModal(account) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
|
|
@ -129,7 +129,7 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
|
const excludeTypesFromSettings = state => state.getIn(['settings', 'notifications', 'shows']).filter(enabled => !enabled).keySeq().toJS();
|
||||||
|
|
||||||
|
@ -210,14 +210,14 @@ export function expandNotifications({ maxId, forceLoad } = {}, done = noOp) {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandNotificationsRequest(isLoadingMore) {
|
export function expandNotificationsRequest(isLoadingMore) {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_EXPAND_REQUEST,
|
type: NOTIFICATIONS_EXPAND_REQUEST,
|
||||||
skipLoading: !isLoadingMore,
|
skipLoading: !isLoadingMore,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) {
|
export function expandNotificationsSuccess(notifications, next, isLoadingMore, isLoadingRecent, usePendingItems) {
|
||||||
return {
|
return {
|
||||||
|
@ -228,7 +228,7 @@ export function expandNotificationsSuccess(notifications, next, isLoadingMore, i
|
||||||
usePendingItems,
|
usePendingItems,
|
||||||
skipLoading: !isLoadingMore,
|
skipLoading: !isLoadingMore,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandNotificationsFail(error, isLoadingMore) {
|
export function expandNotificationsFail(error, isLoadingMore) {
|
||||||
return {
|
return {
|
||||||
|
@ -237,7 +237,7 @@ export function expandNotificationsFail(error, isLoadingMore) {
|
||||||
skipLoading: !isLoadingMore,
|
skipLoading: !isLoadingMore,
|
||||||
skipAlert: !isLoadingMore || error.name === 'AbortError',
|
skipAlert: !isLoadingMore || error.name === 'AbortError',
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearNotifications() {
|
export function clearNotifications() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -247,14 +247,14 @@ export function clearNotifications() {
|
||||||
|
|
||||||
api(getState).post('/api/v1/notifications/clear');
|
api(getState).post('/api/v1/notifications/clear');
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function scrollTopNotifications(top) {
|
export function scrollTopNotifications(top) {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_SCROLL_TOP,
|
type: NOTIFICATIONS_SCROLL_TOP,
|
||||||
top,
|
top,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteMarkedNotifications() {
|
export function deleteMarkedNotifications() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -278,33 +278,33 @@ export function deleteMarkedNotifications() {
|
||||||
dispatch(deleteMarkedNotificationsFail(error));
|
dispatch(deleteMarkedNotificationsFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function enterNotificationClearingMode(yes) {
|
export function enterNotificationClearingMode(yes) {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_ENTER_CLEARING_MODE,
|
type: NOTIFICATIONS_ENTER_CLEARING_MODE,
|
||||||
yes: yes,
|
yes: yes,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function markAllNotifications(yes) {
|
export function markAllNotifications(yes) {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_MARK_ALL_FOR_DELETE,
|
type: NOTIFICATIONS_MARK_ALL_FOR_DELETE,
|
||||||
yes: yes, // true, false or null. null = invert
|
yes: yes, // true, false or null. null = invert
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteMarkedNotificationsRequest() {
|
export function deleteMarkedNotificationsRequest() {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_DELETE_MARKED_REQUEST,
|
type: NOTIFICATIONS_DELETE_MARKED_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteMarkedNotificationsFail() {
|
export function deleteMarkedNotificationsFail() {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_DELETE_MARKED_FAIL,
|
type: NOTIFICATIONS_DELETE_MARKED_FAIL,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function markNotificationForDelete(id, yes) {
|
export function markNotificationForDelete(id, yes) {
|
||||||
return {
|
return {
|
||||||
|
@ -312,32 +312,32 @@ export function markNotificationForDelete(id, yes) {
|
||||||
id: id,
|
id: id,
|
||||||
yes: yes,
|
yes: yes,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteMarkedNotificationsSuccess() {
|
export function deleteMarkedNotificationsSuccess() {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_DELETE_MARKED_SUCCESS,
|
type: NOTIFICATIONS_DELETE_MARKED_SUCCESS,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function mountNotifications() {
|
export function mountNotifications() {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_MOUNT,
|
type: NOTIFICATIONS_MOUNT,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmountNotifications() {
|
export function unmountNotifications() {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_UNMOUNT,
|
type: NOTIFICATIONS_UNMOUNT,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function notificationsSetVisibility(visibility) {
|
export function notificationsSetVisibility(visibility) {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_SET_VISIBILITY,
|
type: NOTIFICATIONS_SET_VISIBILITY,
|
||||||
visibility: visibility,
|
visibility: visibility,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function setFilter (filterType) {
|
export function setFilter (filterType) {
|
||||||
return dispatch => {
|
return dispatch => {
|
||||||
|
@ -349,13 +349,13 @@ export function setFilter (filterType) {
|
||||||
dispatch(expandNotifications({ forceLoad: true }));
|
dispatch(expandNotifications({ forceLoad: true }));
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function markNotificationsAsRead() {
|
export function markNotificationsAsRead() {
|
||||||
return {
|
return {
|
||||||
type: NOTIFICATIONS_MARK_AS_READ,
|
type: NOTIFICATIONS_MARK_AS_READ,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
// Browser support
|
// Browser support
|
||||||
export function setupBrowserNotifications() {
|
export function setupBrowserNotifications() {
|
||||||
|
@ -380,7 +380,7 @@ export function requestBrowserPermission(callback = noOp) {
|
||||||
callback(permission);
|
callback(permission);
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function setBrowserSupport (value) {
|
export function setBrowserSupport (value) {
|
||||||
return {
|
return {
|
||||||
|
|
|
@ -11,4 +11,4 @@ export function showOnboardingOnce() {
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -18,13 +18,13 @@ export function fetchPinnedStatuses() {
|
||||||
dispatch(fetchPinnedStatusesFail(error));
|
dispatch(fetchPinnedStatusesFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedStatusesRequest() {
|
export function fetchPinnedStatusesRequest() {
|
||||||
return {
|
return {
|
||||||
type: PINNED_STATUSES_FETCH_REQUEST,
|
type: PINNED_STATUSES_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedStatusesSuccess(statuses, next) {
|
export function fetchPinnedStatusesSuccess(statuses, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -32,11 +32,11 @@ export function fetchPinnedStatusesSuccess(statuses, next) {
|
||||||
statuses,
|
statuses,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchPinnedStatusesFail(error) {
|
export function fetchPinnedStatusesFail(error) {
|
||||||
return {
|
return {
|
||||||
type: PINNED_STATUSES_FETCH_FAIL,
|
type: PINNED_STATUSES_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -19,13 +19,13 @@ export function changeSearch(value) {
|
||||||
type: SEARCH_CHANGE,
|
type: SEARCH_CHANGE,
|
||||||
value,
|
value,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearSearch() {
|
export function clearSearch() {
|
||||||
return {
|
return {
|
||||||
type: SEARCH_CLEAR,
|
type: SEARCH_CLEAR,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function submitSearch() {
|
export function submitSearch() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -60,13 +60,13 @@ export function submitSearch() {
|
||||||
dispatch(fetchSearchFail(error));
|
dispatch(fetchSearchFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchSearchRequest() {
|
export function fetchSearchRequest() {
|
||||||
return {
|
return {
|
||||||
type: SEARCH_FETCH_REQUEST,
|
type: SEARCH_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchSearchSuccess(results, searchTerm) {
|
export function fetchSearchSuccess(results, searchTerm) {
|
||||||
return {
|
return {
|
||||||
|
@ -74,14 +74,14 @@ export function fetchSearchSuccess(results, searchTerm) {
|
||||||
results,
|
results,
|
||||||
searchTerm,
|
searchTerm,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchSearchFail(error) {
|
export function fetchSearchFail(error) {
|
||||||
return {
|
return {
|
||||||
type: SEARCH_FETCH_FAIL,
|
type: SEARCH_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const expandSearch = type => (dispatch, getState) => {
|
export const expandSearch = type => (dispatch, getState) => {
|
||||||
const value = getState().getIn(['search', 'value']);
|
const value = getState().getIn(['search', 'value']);
|
||||||
|
|
|
@ -15,7 +15,7 @@ export function changeSetting(path, value) {
|
||||||
|
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
const debouncedSave = debounce((dispatch, getState) => {
|
const debouncedSave = debounce((dispatch, getState) => {
|
||||||
if (getState().getIn(['settings', 'saved'])) {
|
if (getState().getIn(['settings', 'saved'])) {
|
||||||
|
@ -31,4 +31,4 @@ const debouncedSave = debounce((dispatch, getState) => {
|
||||||
|
|
||||||
export function saveSettings() {
|
export function saveSettings() {
|
||||||
return (dispatch, getState) => debouncedSave(dispatch, getState);
|
return (dispatch, getState) => debouncedSave(dispatch, getState);
|
||||||
};
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ export function fetchStatusRequest(id, skipLoading) {
|
||||||
id,
|
id,
|
||||||
skipLoading,
|
skipLoading,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchStatus(id, forceFetch = false) {
|
export function fetchStatus(id, forceFetch = false) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -66,14 +66,14 @@ export function fetchStatus(id, forceFetch = false) {
|
||||||
dispatch(fetchStatusFail(id, error, skipLoading));
|
dispatch(fetchStatusFail(id, error, skipLoading));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchStatusSuccess(skipLoading) {
|
export function fetchStatusSuccess(skipLoading) {
|
||||||
return {
|
return {
|
||||||
type: STATUS_FETCH_SUCCESS,
|
type: STATUS_FETCH_SUCCESS,
|
||||||
skipLoading,
|
skipLoading,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchStatusFail(id, error, skipLoading) {
|
export function fetchStatusFail(id, error, skipLoading) {
|
||||||
return {
|
return {
|
||||||
|
@ -83,7 +83,7 @@ export function fetchStatusFail(id, error, skipLoading) {
|
||||||
skipLoading,
|
skipLoading,
|
||||||
skipAlert: true,
|
skipAlert: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function redraft(status, raw_text, content_type) {
|
export function redraft(status, raw_text, content_type) {
|
||||||
return {
|
return {
|
||||||
|
@ -92,7 +92,7 @@ export function redraft(status, raw_text, content_type) {
|
||||||
raw_text,
|
raw_text,
|
||||||
content_type,
|
content_type,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const editStatus = (id, routerHistory) => (dispatch, getState) => {
|
export const editStatus = (id, routerHistory) => (dispatch, getState) => {
|
||||||
let status = getState().getIn(['statuses', id]);
|
let status = getState().getIn(['statuses', id]);
|
||||||
|
@ -148,21 +148,21 @@ export function deleteStatus(id, routerHistory, withRedraft = false) {
|
||||||
dispatch(deleteStatusFail(id, error));
|
dispatch(deleteStatusFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteStatusRequest(id) {
|
export function deleteStatusRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: STATUS_DELETE_REQUEST,
|
type: STATUS_DELETE_REQUEST,
|
||||||
id: id,
|
id: id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteStatusSuccess(id) {
|
export function deleteStatusSuccess(id) {
|
||||||
return {
|
return {
|
||||||
type: STATUS_DELETE_SUCCESS,
|
type: STATUS_DELETE_SUCCESS,
|
||||||
id: id,
|
id: id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteStatusFail(id, error) {
|
export function deleteStatusFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -170,7 +170,7 @@ export function deleteStatusFail(id, error) {
|
||||||
id: id,
|
id: id,
|
||||||
error: error,
|
error: error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const updateStatus = status => dispatch =>
|
export const updateStatus = status => dispatch =>
|
||||||
dispatch(importFetchedStatus(status));
|
dispatch(importFetchedStatus(status));
|
||||||
|
@ -191,14 +191,14 @@ export function fetchContext(id) {
|
||||||
dispatch(fetchContextFail(id, error));
|
dispatch(fetchContextFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchContextRequest(id) {
|
export function fetchContextRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: CONTEXT_FETCH_REQUEST,
|
type: CONTEXT_FETCH_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchContextSuccess(id, ancestors, descendants) {
|
export function fetchContextSuccess(id, ancestors, descendants) {
|
||||||
return {
|
return {
|
||||||
|
@ -208,7 +208,7 @@ export function fetchContextSuccess(id, ancestors, descendants) {
|
||||||
descendants,
|
descendants,
|
||||||
statuses: ancestors.concat(descendants),
|
statuses: ancestors.concat(descendants),
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchContextFail(id, error) {
|
export function fetchContextFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -217,7 +217,7 @@ export function fetchContextFail(id, error) {
|
||||||
error,
|
error,
|
||||||
skipAlert: true,
|
skipAlert: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function muteStatus(id) {
|
export function muteStatus(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -229,21 +229,21 @@ export function muteStatus(id) {
|
||||||
dispatch(muteStatusFail(id, error));
|
dispatch(muteStatusFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function muteStatusRequest(id) {
|
export function muteStatusRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: STATUS_MUTE_REQUEST,
|
type: STATUS_MUTE_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function muteStatusSuccess(id) {
|
export function muteStatusSuccess(id) {
|
||||||
return {
|
return {
|
||||||
type: STATUS_MUTE_SUCCESS,
|
type: STATUS_MUTE_SUCCESS,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function muteStatusFail(id, error) {
|
export function muteStatusFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -251,7 +251,7 @@ export function muteStatusFail(id, error) {
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteStatus(id) {
|
export function unmuteStatus(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -263,21 +263,21 @@ export function unmuteStatus(id) {
|
||||||
dispatch(unmuteStatusFail(id, error));
|
dispatch(unmuteStatusFail(id, error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteStatusRequest(id) {
|
export function unmuteStatusRequest(id) {
|
||||||
return {
|
return {
|
||||||
type: STATUS_UNMUTE_REQUEST,
|
type: STATUS_UNMUTE_REQUEST,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteStatusSuccess(id) {
|
export function unmuteStatusSuccess(id) {
|
||||||
return {
|
return {
|
||||||
type: STATUS_UNMUTE_SUCCESS,
|
type: STATUS_UNMUTE_SUCCESS,
|
||||||
id,
|
id,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function unmuteStatusFail(id, error) {
|
export function unmuteStatusFail(id, error) {
|
||||||
return {
|
return {
|
||||||
|
@ -285,7 +285,7 @@ export function unmuteStatusFail(id, error) {
|
||||||
id,
|
id,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function hideStatus(ids) {
|
export function hideStatus(ids) {
|
||||||
if (!Array.isArray(ids)) {
|
if (!Array.isArray(ids)) {
|
||||||
|
@ -296,7 +296,7 @@ export function hideStatus(ids) {
|
||||||
type: STATUS_HIDE,
|
type: STATUS_HIDE,
|
||||||
ids,
|
ids,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function revealStatus(ids) {
|
export function revealStatus(ids) {
|
||||||
if (!Array.isArray(ids)) {
|
if (!Array.isArray(ids)) {
|
||||||
|
@ -307,7 +307,7 @@ export function revealStatus(ids) {
|
||||||
type: STATUS_REVEAL,
|
type: STATUS_REVEAL,
|
||||||
ids,
|
ids,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function toggleStatusCollapse(id, isCollapsed) {
|
export function toggleStatusCollapse(id, isCollapsed) {
|
||||||
return {
|
return {
|
||||||
|
@ -315,7 +315,7 @@ export function toggleStatusCollapse(id, isCollapsed) {
|
||||||
id,
|
id,
|
||||||
isCollapsed,
|
isCollapsed,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const translateStatus = id => (dispatch, getState) => {
|
export const translateStatus = id => (dispatch, getState) => {
|
||||||
dispatch(translateStatusRequest(id));
|
dispatch(translateStatusRequest(id));
|
||||||
|
|
|
@ -18,7 +18,7 @@ const applyMigrations = (state) => {
|
||||||
if (state.getIn(['settings', 'notifications', 'showUnread']) !== false) {
|
if (state.getIn(['settings', 'notifications', 'showUnread']) !== false) {
|
||||||
state.setIn(['settings', 'notifications', 'showUnread'], state.getIn(['local_settings', 'notifications', 'show_unread']));
|
state.setIn(['settings', 'notifications', 'showUnread'], state.getIn(['local_settings', 'notifications', 'show_unread']));
|
||||||
}
|
}
|
||||||
state.removeIn(['local_settings', 'notifications', 'show_unread'])
|
state.removeIn(['local_settings', 'notifications', 'show_unread']);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -36,4 +36,4 @@ export function hydrateStore(rawState) {
|
||||||
dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
|
dispatch(importFetchedAccounts(Object.values(rawState.accounts)));
|
||||||
dispatch(saveSettings());
|
dispatch(saveSettings());
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
|
@ -21,14 +21,14 @@ export function fetchSuggestions(withRelationships = false) {
|
||||||
}
|
}
|
||||||
}).catch(error => dispatch(fetchSuggestionsFail(error)));
|
}).catch(error => dispatch(fetchSuggestionsFail(error)));
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchSuggestionsRequest() {
|
export function fetchSuggestionsRequest() {
|
||||||
return {
|
return {
|
||||||
type: SUGGESTIONS_FETCH_REQUEST,
|
type: SUGGESTIONS_FETCH_REQUEST,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchSuggestionsSuccess(suggestions) {
|
export function fetchSuggestionsSuccess(suggestions) {
|
||||||
return {
|
return {
|
||||||
|
@ -36,7 +36,7 @@ export function fetchSuggestionsSuccess(suggestions) {
|
||||||
suggestions,
|
suggestions,
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchSuggestionsFail(error) {
|
export function fetchSuggestionsFail(error) {
|
||||||
return {
|
return {
|
||||||
|
@ -45,7 +45,7 @@ export function fetchSuggestionsFail(error) {
|
||||||
skipLoading: true,
|
skipLoading: true,
|
||||||
skipAlert: true,
|
skipAlert: true,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const dismissSuggestion = accountId => (dispatch, getState) => {
|
export const dismissSuggestion = accountId => (dispatch, getState) => {
|
||||||
dispatch({
|
dispatch({
|
||||||
|
|
|
@ -60,7 +60,7 @@ export function fetchFollowedHashtagsRequest() {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWED_HASHTAGS_FETCH_REQUEST,
|
type: FOLLOWED_HASHTAGS_FETCH_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowedHashtagsSuccess(followed_tags, next) {
|
export function fetchFollowedHashtagsSuccess(followed_tags, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -68,14 +68,14 @@ export function fetchFollowedHashtagsSuccess(followed_tags, next) {
|
||||||
followed_tags,
|
followed_tags,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fetchFollowedHashtagsFail(error) {
|
export function fetchFollowedHashtagsFail(error) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWED_HASHTAGS_FETCH_FAIL,
|
type: FOLLOWED_HASHTAGS_FETCH_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowedHashtags() {
|
export function expandFollowedHashtags() {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -94,13 +94,13 @@ export function expandFollowedHashtags() {
|
||||||
dispatch(expandFollowedHashtagsFail(error));
|
dispatch(expandFollowedHashtagsFail(error));
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowedHashtagsRequest() {
|
export function expandFollowedHashtagsRequest() {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWED_HASHTAGS_EXPAND_REQUEST,
|
type: FOLLOWED_HASHTAGS_EXPAND_REQUEST,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowedHashtagsSuccess(followed_tags, next) {
|
export function expandFollowedHashtagsSuccess(followed_tags, next) {
|
||||||
return {
|
return {
|
||||||
|
@ -108,14 +108,14 @@ export function expandFollowedHashtagsSuccess(followed_tags, next) {
|
||||||
followed_tags,
|
followed_tags,
|
||||||
next,
|
next,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandFollowedHashtagsFail(error) {
|
export function expandFollowedHashtagsFail(error) {
|
||||||
return {
|
return {
|
||||||
type: FOLLOWED_HASHTAGS_EXPAND_FAIL,
|
type: FOLLOWED_HASHTAGS_EXPAND_FAIL,
|
||||||
error,
|
error,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const followHashtag = name => (dispatch, getState) => {
|
export const followHashtag = name => (dispatch, getState) => {
|
||||||
dispatch(followHashtagRequest(name));
|
dispatch(followHashtagRequest(name));
|
||||||
|
|
|
@ -55,14 +55,14 @@ export function updateTimeline(timeline, status, accept) {
|
||||||
timeline,
|
timeline,
|
||||||
status,
|
status,
|
||||||
usePendingItems: preferPendingItems,
|
usePendingItems: preferPendingItems,
|
||||||
filtered
|
filtered,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (timeline === 'home') {
|
if (timeline === 'home') {
|
||||||
dispatch(submitMarkers());
|
dispatch(submitMarkers());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function deleteFromTimelines(id) {
|
export function deleteFromTimelines(id) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -78,13 +78,13 @@ export function deleteFromTimelines(id) {
|
||||||
reblogOf,
|
reblogOf,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function clearTimeline(timeline) {
|
export function clearTimeline(timeline) {
|
||||||
return (dispatch) => {
|
return (dispatch) => {
|
||||||
dispatch({ type: TIMELINE_CLEAR, timeline });
|
dispatch({ type: TIMELINE_CLEAR, timeline });
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
const noOp = () => {};
|
const noOp = () => {};
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ export function expandTimeline(timelineId, path, params = {}, done = noOp) {
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) {
|
export function fillTimelineGaps(timelineId, path, params = {}, done = noOp) {
|
||||||
return (dispatch, getState) => {
|
return (dispatch, getState) => {
|
||||||
|
@ -181,7 +181,7 @@ export function expandTimelineRequest(timeline, isLoadingMore) {
|
||||||
timeline,
|
timeline,
|
||||||
skipLoading: !isLoadingMore,
|
skipLoading: !isLoadingMore,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadingRecent, isLoadingMore, usePendingItems) {
|
export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadingRecent, isLoadingMore, usePendingItems) {
|
||||||
return {
|
return {
|
||||||
|
@ -194,7 +194,7 @@ export function expandTimelineSuccess(timeline, statuses, next, partial, isLoadi
|
||||||
usePendingItems,
|
usePendingItems,
|
||||||
skipLoading: !isLoadingMore,
|
skipLoading: !isLoadingMore,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function expandTimelineFail(timeline, error, isLoadingMore) {
|
export function expandTimelineFail(timeline, error, isLoadingMore) {
|
||||||
return {
|
return {
|
||||||
|
@ -204,7 +204,7 @@ export function expandTimelineFail(timeline, error, isLoadingMore) {
|
||||||
skipLoading: !isLoadingMore,
|
skipLoading: !isLoadingMore,
|
||||||
skipNotFound: timeline.startsWith('account:'),
|
skipNotFound: timeline.startsWith('account:'),
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function scrollTopTimeline(timeline, top) {
|
export function scrollTopTimeline(timeline, top) {
|
||||||
return {
|
return {
|
||||||
|
@ -212,7 +212,7 @@ export function scrollTopTimeline(timeline, top) {
|
||||||
timeline,
|
timeline,
|
||||||
top,
|
top,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export function connectTimeline(timeline) {
|
export function connectTimeline(timeline) {
|
||||||
return {
|
return {
|
||||||
|
@ -220,7 +220,7 @@ export function connectTimeline(timeline) {
|
||||||
timeline,
|
timeline,
|
||||||
usePendingItems: preferPendingItems,
|
usePendingItems: preferPendingItems,
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
export const disconnectTimeline = timeline => ({
|
export const disconnectTimeline = timeline => ({
|
||||||
type: TIMELINE_DISCONNECT,
|
type: TIMELINE_DISCONNECT,
|
||||||
|
|
|
@ -8,4 +8,4 @@ export default function compareId (id1, id2) {
|
||||||
} else {
|
} else {
|
||||||
return id1.length > id2.length ? 1 : -1;
|
return id1.length > id2.length ? 1 : -1;
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
|
@ -48,27 +48,27 @@ class Account extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleFollow = () => {
|
handleFollow = () => {
|
||||||
this.props.onFollow(this.props.account);
|
this.props.onFollow(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleBlock = () => {
|
handleBlock = () => {
|
||||||
this.props.onBlock(this.props.account);
|
this.props.onBlock(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMute = () => {
|
handleMute = () => {
|
||||||
this.props.onMute(this.props.account);
|
this.props.onMute(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMuteNotifications = () => {
|
handleMuteNotifications = () => {
|
||||||
this.props.onMuteNotifications(this.props.account, true);
|
this.props.onMuteNotifications(this.props.account, true);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleUnmuteNotifications = () => {
|
handleUnmuteNotifications = () => {
|
||||||
this.props.onMuteNotifications(this.props.account, false);
|
this.props.onMuteNotifications(this.props.account, false);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleAction = () => {
|
handleAction = () => {
|
||||||
this.props.onActionClick(this.props.account);
|
this.props.onActionClick(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const {
|
const {
|
||||||
|
|
|
@ -137,7 +137,7 @@ export default class Retention extends React.PureComponent {
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
title = <FormattedMessage id='admin.dashboard.monthly_retention' defaultMessage='User retention rate by month after sign-up' />;
|
title = <FormattedMessage id='admin.dashboard.monthly_retention' defaultMessage='User retention rate by month after sign-up' />;
|
||||||
};
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='retention'>
|
<div className='retention'>
|
||||||
|
|
|
@ -38,13 +38,13 @@ export default class AnimatedNumber extends React.PureComponent {
|
||||||
const { direction } = this.state;
|
const { direction } = this.state;
|
||||||
|
|
||||||
return { y: -1 * direction };
|
return { y: -1 * direction };
|
||||||
}
|
};
|
||||||
|
|
||||||
willLeave = () => {
|
willLeave = () => {
|
||||||
const { direction } = this.state;
|
const { direction } = this.state;
|
||||||
|
|
||||||
return { y: spring(1 * direction, { damping: 35, stiffness: 400 }) };
|
return { y: spring(1 * direction, { damping: 35, stiffness: 400 }) };
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { value, obfuscate } = this.props;
|
const { value, obfuscate } = this.props;
|
||||||
|
|
|
@ -51,6 +51,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
||||||
searchTokens: PropTypes.arrayOf(PropTypes.string),
|
searchTokens: PropTypes.arrayOf(PropTypes.string),
|
||||||
maxLength: PropTypes.number,
|
maxLength: PropTypes.number,
|
||||||
lang: PropTypes.string,
|
lang: PropTypes.string,
|
||||||
|
spellCheck: PropTypes.string,
|
||||||
};
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
|
@ -78,7 +79,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.onChange(e);
|
this.props.onChange(e);
|
||||||
}
|
};
|
||||||
|
|
||||||
onKeyDown = (e) => {
|
onKeyDown = (e) => {
|
||||||
const { suggestions, disabled } = this.props;
|
const { suggestions, disabled } = this.props;
|
||||||
|
@ -136,22 +137,22 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.onKeyDown(e);
|
this.props.onKeyDown(e);
|
||||||
}
|
};
|
||||||
|
|
||||||
onBlur = () => {
|
onBlur = () => {
|
||||||
this.setState({ suggestionsHidden: true, focused: false });
|
this.setState({ suggestionsHidden: true, focused: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = () => {
|
onFocus = () => {
|
||||||
this.setState({ focused: true });
|
this.setState({ focused: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionClick = (e) => {
|
onSuggestionClick = (e) => {
|
||||||
const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));
|
const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);
|
this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);
|
||||||
this.input.focus();
|
this.input.focus();
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
|
if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
|
||||||
|
@ -161,7 +162,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
||||||
|
|
||||||
setInput = (c) => {
|
setInput = (c) => {
|
||||||
this.input = c;
|
this.input = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
renderSuggestion = (suggestion, i) => {
|
renderSuggestion = (suggestion, i) => {
|
||||||
const { selectedSuggestion } = this.state;
|
const { selectedSuggestion } = this.state;
|
||||||
|
@ -183,10 +184,10 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
||||||
{inner}
|
{inner}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength, lang } = this.props;
|
const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, className, id, maxLength, lang, spellCheck } = this.props;
|
||||||
const { suggestionsHidden } = this.state;
|
const { suggestionsHidden } = this.state;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
@ -212,6 +213,7 @@ export default class AutosuggestInput extends ImmutablePureComponent {
|
||||||
className={className}
|
className={className}
|
||||||
maxLength={maxLength}
|
maxLength={maxLength}
|
||||||
lang={lang}
|
lang={lang}
|
||||||
|
spellCheck={spellCheck}
|
||||||
/>
|
/>
|
||||||
</label>
|
</label>
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.onChange(e);
|
this.props.onChange(e);
|
||||||
}
|
};
|
||||||
|
|
||||||
onKeyDown = (e) => {
|
onKeyDown = (e) => {
|
||||||
const { suggestions, disabled } = this.props;
|
const { suggestions, disabled } = this.props;
|
||||||
|
@ -133,25 +133,25 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.props.onKeyDown(e);
|
this.props.onKeyDown(e);
|
||||||
}
|
};
|
||||||
|
|
||||||
onBlur = () => {
|
onBlur = () => {
|
||||||
this.setState({ suggestionsHidden: true, focused: false });
|
this.setState({ suggestionsHidden: true, focused: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
onFocus = (e) => {
|
onFocus = (e) => {
|
||||||
this.setState({ focused: true });
|
this.setState({ focused: true });
|
||||||
if (this.props.onFocus) {
|
if (this.props.onFocus) {
|
||||||
this.props.onFocus(e);
|
this.props.onFocus(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onSuggestionClick = (e) => {
|
onSuggestionClick = (e) => {
|
||||||
const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));
|
const suggestion = this.props.suggestions.get(e.currentTarget.getAttribute('data-index'));
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);
|
this.props.onSuggestionSelected(this.state.tokenStart, this.state.lastToken, suggestion);
|
||||||
this.textarea.focus();
|
this.textarea.focus();
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
|
if (nextProps.suggestions !== this.props.suggestions && nextProps.suggestions.size > 0 && this.state.suggestionsHidden && this.state.focused) {
|
||||||
|
@ -161,14 +161,14 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
|
||||||
|
|
||||||
setTextarea = (c) => {
|
setTextarea = (c) => {
|
||||||
this.textarea = c;
|
this.textarea = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
onPaste = (e) => {
|
onPaste = (e) => {
|
||||||
if (e.clipboardData && e.clipboardData.files.length === 1) {
|
if (e.clipboardData && e.clipboardData.files.length === 1) {
|
||||||
this.props.onPaste(e.clipboardData.files);
|
this.props.onPaste(e.clipboardData.files);
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
renderSuggestion = (suggestion, i) => {
|
renderSuggestion = (suggestion, i) => {
|
||||||
const { selectedSuggestion } = this.state;
|
const { selectedSuggestion } = this.state;
|
||||||
|
@ -190,7 +190,7 @@ export default class AutosuggestTextarea extends ImmutablePureComponent {
|
||||||
{inner}
|
{inner}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, lang, children } = this.props;
|
const { value, suggestions, disabled, placeholder, onKeyUp, autoFocus, lang, children } = this.props;
|
||||||
|
|
|
@ -28,12 +28,12 @@ export default class Avatar extends React.PureComponent {
|
||||||
handleMouseEnter = () => {
|
handleMouseEnter = () => {
|
||||||
if (this.props.animate) return;
|
if (this.props.animate) return;
|
||||||
this.setState({ hovering: true });
|
this.setState({ hovering: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseLeave = () => {
|
handleMouseLeave = () => {
|
||||||
if (this.props.animate) return;
|
if (this.props.animate) return;
|
||||||
this.setState({ hovering: false });
|
this.setState({ hovering: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const {
|
const {
|
||||||
|
|
|
@ -19,11 +19,11 @@ export default class Button extends React.PureComponent {
|
||||||
if (!this.props.disabled) {
|
if (!this.props.disabled) {
|
||||||
this.props.onClick(e);
|
this.props.onClick(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
setRef = (c) => {
|
setRef = (c) => {
|
||||||
this.node = c;
|
this.node = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
focus() {
|
focus() {
|
||||||
this.node.focus();
|
this.node.focus();
|
||||||
|
|
|
@ -29,11 +29,11 @@ export default class Column extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
this._interruptScrollAnimation();
|
this._interruptScrollAnimation();
|
||||||
}
|
};
|
||||||
|
|
||||||
setRef = c => {
|
setRef = c => {
|
||||||
this.node = c;
|
this.node = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
if (this.props.bindToDocument) {
|
if (this.props.bindToDocument) {
|
||||||
|
|
|
@ -26,7 +26,7 @@ export default class ColumnBackButton extends React.PureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.context.router.history.push('/');
|
this.context.router.history.push('/');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { multiColumn } = this.props;
|
const { multiColumn } = this.props;
|
||||||
|
|
|
@ -21,7 +21,7 @@ export default class ColumnBackButtonSlim extends React.PureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.context.router.history.push('/');
|
this.context.router.history.push('/');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
|
|
|
@ -55,39 +55,39 @@ class ColumnHeader extends React.PureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.context.router.history.push('/');
|
this.context.router.history.push('/');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleToggleClick = (e) => {
|
handleToggleClick = (e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
this.setState({ collapsed: !this.state.collapsed, animating: true });
|
this.setState({ collapsed: !this.state.collapsed, animating: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleTitleClick = () => {
|
handleTitleClick = () => {
|
||||||
this.props.onClick?.();
|
this.props.onClick?.();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMoveLeft = () => {
|
handleMoveLeft = () => {
|
||||||
this.props.onMove(-1);
|
this.props.onMove(-1);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMoveRight = () => {
|
handleMoveRight = () => {
|
||||||
this.props.onMove(1);
|
this.props.onMove(1);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleBackClick = (event) => {
|
handleBackClick = (event) => {
|
||||||
this.historyBack(event.shiftKey);
|
this.historyBack(event.shiftKey);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleTransitionEnd = () => {
|
handleTransitionEnd = () => {
|
||||||
this.setState({ animating: false });
|
this.setState({ animating: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
handlePin = () => {
|
handlePin = () => {
|
||||||
if (!this.props.pinned) {
|
if (!this.props.pinned) {
|
||||||
this.historyBack();
|
this.historyBack();
|
||||||
}
|
}
|
||||||
this.props.onPin();
|
this.props.onPin();
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent, collapseIssues } = this.props;
|
const { title, icon, active, children, pinned, multiColumn, extraButton, showBackButton, intl: { formatMessage }, placeholder, appendContent, collapseIssues } = this.props;
|
||||||
|
|
|
@ -24,7 +24,7 @@ class DismissableBanner extends React.PureComponent {
|
||||||
handleDismiss = () => {
|
handleDismiss = () => {
|
||||||
const { id } = this.props;
|
const { id } = this.props;
|
||||||
this.setState({ visible: false }, () => bannerSettings.set(id, true));
|
this.setState({ visible: false }, () => bannerSettings.set(id, true));
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { visible } = this.state;
|
const { visible } = this.state;
|
||||||
|
|
|
@ -27,7 +27,7 @@ export default class DisplayName extends React.PureComponent {
|
||||||
let emoji = emojis[i];
|
let emoji = emojis[i];
|
||||||
emoji.src = emoji.getAttribute('data-original');
|
emoji.src = emoji.getAttribute('data-original');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseLeave = ({ currentTarget }) => {
|
handleMouseLeave = ({ currentTarget }) => {
|
||||||
if (autoPlayGif) {
|
if (autoPlayGif) {
|
||||||
|
@ -40,7 +40,7 @@ export default class DisplayName extends React.PureComponent {
|
||||||
let emoji = emojis[i];
|
let emoji = emojis[i];
|
||||||
emoji.src = emoji.getAttribute('data-static');
|
emoji.src = emoji.getAttribute('data-static');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { account, className, inline, localDomain, others, onAccountClick } = this.props;
|
const { account, className, inline, localDomain, others, onAccountClick } = this.props;
|
||||||
|
@ -74,7 +74,7 @@ export default class DisplayName extends React.PureComponent {
|
||||||
)).reduce((prev, cur) => [prev, ', ', cur]);
|
)).reduce((prev, cur) => [prev, ', ', cur]);
|
||||||
|
|
||||||
if (others.size - 2 > 0) {
|
if (others.size - 2 > 0) {
|
||||||
displayName.push(` +${others.size - 2}`);
|
displayName.push(` +${others.size - 2}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
suffix = (
|
suffix = (
|
||||||
|
|
|
@ -19,7 +19,7 @@ class Account extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleDomainUnblock = () => {
|
handleDomainUnblock = () => {
|
||||||
this.props.onUnblockDomain(this.props.domain);
|
this.props.onUnblockDomain(this.props.domain);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { domain, intl } = this.props;
|
const { domain, intl } = this.props;
|
||||||
|
|
|
@ -36,7 +36,7 @@ class DropdownMenu extends React.PureComponent {
|
||||||
if (this.node && !this.node.contains(e.target)) {
|
if (this.node && !this.node.contains(e.target)) {
|
||||||
this.props.onClose();
|
this.props.onClose();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
document.addEventListener('click', this.handleDocumentClick, false);
|
document.addEventListener('click', this.handleDocumentClick, false);
|
||||||
|
@ -56,11 +56,11 @@ class DropdownMenu extends React.PureComponent {
|
||||||
|
|
||||||
setRef = c => {
|
setRef = c => {
|
||||||
this.node = c;
|
this.node = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
setFocusRef = c => {
|
setFocusRef = c => {
|
||||||
this.focusedItem = c;
|
this.focusedItem = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
handleKeyDown = e => {
|
handleKeyDown = e => {
|
||||||
const items = Array.from(this.node.querySelectorAll('a, button'));
|
const items = Array.from(this.node.querySelectorAll('a, button'));
|
||||||
|
@ -97,18 +97,18 @@ class DropdownMenu extends React.PureComponent {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleItemKeyPress = e => {
|
handleItemKeyPress = e => {
|
||||||
if (e.key === 'Enter' || e.key === ' ') {
|
if (e.key === 'Enter' || e.key === ' ') {
|
||||||
this.handleClick(e);
|
this.handleClick(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleClick = e => {
|
handleClick = e => {
|
||||||
const { onItemClick } = this.props;
|
const { onItemClick } = this.props;
|
||||||
onItemClick(e);
|
onItemClick(e);
|
||||||
}
|
};
|
||||||
|
|
||||||
renderItem = (option, i) => {
|
renderItem = (option, i) => {
|
||||||
if (option === null) {
|
if (option === null) {
|
||||||
|
@ -124,7 +124,7 @@ class DropdownMenu extends React.PureComponent {
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { items, scrollable, renderHeader, loading } = this.props;
|
const { items, scrollable, renderHeader, loading } = this.props;
|
||||||
|
@ -194,7 +194,7 @@ export default class Dropdown extends React.PureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.props.onOpen(this.state.id, this.handleItemClick, type !== 'click');
|
this.props.onOpen(this.state.id, this.handleItemClick, type !== 'click');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleClose = () => {
|
handleClose = () => {
|
||||||
if (this.activeElement) {
|
if (this.activeElement) {
|
||||||
|
@ -202,13 +202,13 @@ export default class Dropdown extends React.PureComponent {
|
||||||
this.activeElement = null;
|
this.activeElement = null;
|
||||||
}
|
}
|
||||||
this.props.onClose(this.state.id);
|
this.props.onClose(this.state.id);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseDown = () => {
|
handleMouseDown = () => {
|
||||||
if (!this.state.open) {
|
if (!this.state.open) {
|
||||||
this.activeElement = document.activeElement;
|
this.activeElement = document.activeElement;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleButtonKeyDown = (e) => {
|
handleButtonKeyDown = (e) => {
|
||||||
switch(e.key) {
|
switch(e.key) {
|
||||||
|
@ -217,7 +217,7 @@ export default class Dropdown extends React.PureComponent {
|
||||||
this.handleMouseDown();
|
this.handleMouseDown();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleKeyPress = (e) => {
|
handleKeyPress = (e) => {
|
||||||
switch(e.key) {
|
switch(e.key) {
|
||||||
|
@ -228,7 +228,7 @@ export default class Dropdown extends React.PureComponent {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleItemClick = e => {
|
handleItemClick = e => {
|
||||||
const { onItemClick } = this.props;
|
const { onItemClick } = this.props;
|
||||||
|
@ -247,25 +247,25 @@ export default class Dropdown extends React.PureComponent {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.context.router.history.push(item.to);
|
this.context.router.history.push(item.to);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
setTargetRef = c => {
|
setTargetRef = c => {
|
||||||
this.target = c;
|
this.target = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
findTarget = () => {
|
findTarget = () => {
|
||||||
return this.target;
|
return this.target;
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillUnmount = () => {
|
componentWillUnmount = () => {
|
||||||
if (this.state.id === this.props.openDropdownId) {
|
if (this.state.id === this.props.openDropdownId) {
|
||||||
this.handleClose();
|
this.handleClose();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
close = () => {
|
close = () => {
|
||||||
this.handleClose();
|
this.handleClose();
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const {
|
const {
|
||||||
|
|
|
@ -36,7 +36,7 @@ class EditedTimestamp extends React.PureComponent {
|
||||||
return (
|
return (
|
||||||
<FormattedMessage id='status.edited_x_times' defaultMessage='Edited {count, plural, one {{count} time} other {{count} times}}' values={{ count: items.size - 1 }} />
|
<FormattedMessage id='status.edited_x_times' defaultMessage='Edited {count, plural, one {{count} time} other {{count} times}}' values={{ count: items.size - 1 }} />
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
renderItem = (item, index, { onClick, onKeyPress }) => {
|
renderItem = (item, index, { onClick, onKeyPress }) => {
|
||||||
const formattedDate = <RelativeTimestamp timestamp={item.get('created_at')} short={false} />;
|
const formattedDate = <RelativeTimestamp timestamp={item.get('created_at')} short={false} />;
|
||||||
|
@ -53,7 +53,7 @@ class EditedTimestamp extends React.PureComponent {
|
||||||
<button data-index={index} onClick={onClick} onKeyPress={onKeyPress}>{label}</button>
|
<button data-index={index} onClick={onClick} onKeyPress={onKeyPress}>{label}</button>
|
||||||
</li>
|
</li>
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { timestamp, intl, statusId } = this.props;
|
const { timestamp, intl, statusId } = this.props;
|
||||||
|
|
|
@ -18,7 +18,7 @@ export default class ErrorBoundary extends React.PureComponent {
|
||||||
stackTrace: undefined,
|
stackTrace: undefined,
|
||||||
mappedStackTrace: undefined,
|
mappedStackTrace: undefined,
|
||||||
componentStack: undefined,
|
componentStack: undefined,
|
||||||
}
|
};
|
||||||
|
|
||||||
componentDidCatch(error, info) {
|
componentDidCatch(error, info) {
|
||||||
this.setState({
|
this.setState({
|
||||||
|
|
|
@ -17,7 +17,7 @@ export default class GIFV extends React.PureComponent {
|
||||||
|
|
||||||
handleLoadedData = () => {
|
handleLoadedData = () => {
|
||||||
this.setState({ loading: false });
|
this.setState({ loading: false });
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
if (nextProps.src !== this.props.src) {
|
if (nextProps.src !== this.props.src) {
|
||||||
|
@ -32,7 +32,7 @@ export default class GIFV extends React.PureComponent {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
onClick();
|
onClick();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { src, width, height, alt } = this.props;
|
const { src, width, height, alt } = this.props;
|
||||||
|
|
|
@ -46,7 +46,7 @@ export default class IconButton extends React.PureComponent {
|
||||||
state = {
|
state = {
|
||||||
activate: false,
|
activate: false,
|
||||||
deactivate: false,
|
deactivate: false,
|
||||||
}
|
};
|
||||||
|
|
||||||
componentWillReceiveProps (nextProps) {
|
componentWillReceiveProps (nextProps) {
|
||||||
if (!nextProps.animate) return;
|
if (!nextProps.animate) return;
|
||||||
|
@ -64,25 +64,25 @@ export default class IconButton extends React.PureComponent {
|
||||||
if (!this.props.disabled) {
|
if (!this.props.disabled) {
|
||||||
this.props.onClick(e);
|
this.props.onClick(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleKeyPress = (e) => {
|
handleKeyPress = (e) => {
|
||||||
if (this.props.onKeyPress && !this.props.disabled) {
|
if (this.props.onKeyPress && !this.props.disabled) {
|
||||||
this.props.onKeyPress(e);
|
this.props.onKeyPress(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseDown = (e) => {
|
handleMouseDown = (e) => {
|
||||||
if (!this.props.disabled && this.props.onMouseDown) {
|
if (!this.props.disabled && this.props.onMouseDown) {
|
||||||
this.props.onMouseDown(e);
|
this.props.onMouseDown(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleKeyDown = (e) => {
|
handleKeyDown = (e) => {
|
||||||
if (!this.props.disabled && this.props.onKeyDown) {
|
if (!this.props.disabled && this.props.onKeyDown) {
|
||||||
this.props.onKeyDown(e);
|
this.props.onKeyDown(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
// Hack required for some icons which have an overriden size
|
// Hack required for some icons which have an overriden size
|
||||||
|
|
|
@ -21,7 +21,7 @@ export default class IntersectionObserverArticle extends React.Component {
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
isHidden: false, // set to true in requestIdleCallback to trigger un-render
|
isHidden: false, // set to true in requestIdleCallback to trigger un-render
|
||||||
}
|
};
|
||||||
|
|
||||||
shouldComponentUpdate (nextProps, nextState) {
|
shouldComponentUpdate (nextProps, nextState) {
|
||||||
const isUnrendered = !this.state.isIntersecting && (this.state.isHidden || this.props.cachedHeight);
|
const isUnrendered = !this.state.isIntersecting && (this.state.isHidden || this.props.cachedHeight);
|
||||||
|
@ -63,7 +63,7 @@ export default class IntersectionObserverArticle extends React.Component {
|
||||||
|
|
||||||
scheduleIdleTask(this.calculateHeight);
|
scheduleIdleTask(this.calculateHeight);
|
||||||
this.setState(this.updateStateAfterIntersection);
|
this.setState(this.updateStateAfterIntersection);
|
||||||
}
|
};
|
||||||
|
|
||||||
updateStateAfterIntersection = (prevState) => {
|
updateStateAfterIntersection = (prevState) => {
|
||||||
if (prevState.isIntersecting !== false && !this.entry.isIntersecting) {
|
if (prevState.isIntersecting !== false && !this.entry.isIntersecting) {
|
||||||
|
@ -73,7 +73,7 @@ export default class IntersectionObserverArticle extends React.Component {
|
||||||
isIntersecting: this.entry.isIntersecting,
|
isIntersecting: this.entry.isIntersecting,
|
||||||
isHidden: false,
|
isHidden: false,
|
||||||
};
|
};
|
||||||
}
|
};
|
||||||
|
|
||||||
calculateHeight = () => {
|
calculateHeight = () => {
|
||||||
const { onHeightChange, saveHeightKey, id } = this.props;
|
const { onHeightChange, saveHeightKey, id } = this.props;
|
||||||
|
@ -84,7 +84,7 @@ export default class IntersectionObserverArticle extends React.Component {
|
||||||
if (onHeightChange && saveHeightKey) {
|
if (onHeightChange && saveHeightKey) {
|
||||||
onHeightChange(saveHeightKey, id, this.height);
|
onHeightChange(saveHeightKey, id, this.height);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
hideIfNotIntersecting = () => {
|
hideIfNotIntersecting = () => {
|
||||||
if (!this.componentMounted) {
|
if (!this.componentMounted) {
|
||||||
|
@ -96,11 +96,11 @@ export default class IntersectionObserverArticle extends React.Component {
|
||||||
// this is to save DOM nodes and avoid using up too much memory.
|
// this is to save DOM nodes and avoid using up too much memory.
|
||||||
// See: https://github.com/mastodon/mastodon/issues/2900
|
// See: https://github.com/mastodon/mastodon/issues/2900
|
||||||
this.setState((prevState) => ({ isHidden: !prevState.isIntersecting }));
|
this.setState((prevState) => ({ isHidden: !prevState.isIntersecting }));
|
||||||
}
|
};
|
||||||
|
|
||||||
handleRef = (node) => {
|
handleRef = (node) => {
|
||||||
this.node = node;
|
this.node = node;
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { children, id, index, listLength, cachedHeight } = this.props;
|
const { children, id, index, listLength, cachedHeight } = this.props;
|
||||||
|
@ -121,8 +121,9 @@ export default class IntersectionObserverArticle extends React.Component {
|
||||||
aria-setsize={listLength}
|
aria-setsize={listLength}
|
||||||
data-id={id}
|
data-id={id}
|
||||||
tabIndex='0'
|
tabIndex='0'
|
||||||
style={style}>
|
style={style}
|
||||||
{children && React.cloneElement(children, { hidden: !isIntersecting && (isHidden || !!cachedHeight) })}
|
>
|
||||||
|
{children && React.cloneElement(children, { hidden: !isIntersecting && (isHidden || !!cachedHeight) })}
|
||||||
</article>
|
</article>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,7 @@ class LoadGap extends React.PureComponent {
|
||||||
|
|
||||||
handleClick = () => {
|
handleClick = () => {
|
||||||
this.props.onClick(this.props.maxId);
|
this.props.onClick(this.props.maxId);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { disabled, intl } = this.props;
|
const { disabled, intl } = this.props;
|
||||||
|
|
|
@ -8,11 +8,11 @@ export default class LoadMore extends React.PureComponent {
|
||||||
onClick: PropTypes.func,
|
onClick: PropTypes.func,
|
||||||
disabled: PropTypes.bool,
|
disabled: PropTypes.bool,
|
||||||
visible: PropTypes.bool,
|
visible: PropTypes.bool,
|
||||||
}
|
};
|
||||||
|
|
||||||
static defaultProps = {
|
static defaultProps = {
|
||||||
visible: true,
|
visible: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { disabled, visible } = this.props;
|
const { disabled, visible } = this.props;
|
||||||
|
|
|
@ -7,7 +7,7 @@ export default class LoadPending extends React.PureComponent {
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
onClick: PropTypes.func,
|
onClick: PropTypes.func,
|
||||||
count: PropTypes.number,
|
count: PropTypes.number,
|
||||||
}
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { count } = this.props;
|
const { count } = this.props;
|
||||||
|
|
|
@ -30,7 +30,7 @@ export default class MediaAttachments extends ImmutablePureComponent {
|
||||||
return (
|
return (
|
||||||
<div className='media-gallery' style={{ height, width }} />
|
<div className='media-gallery' style={{ height, width }} />
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
renderLoadingVideoPlayer = () => {
|
renderLoadingVideoPlayer = () => {
|
||||||
const { height, width } = this.props;
|
const { height, width } = this.props;
|
||||||
|
@ -38,7 +38,7 @@ export default class MediaAttachments extends ImmutablePureComponent {
|
||||||
return (
|
return (
|
||||||
<div className='video-player' style={{ height, width }} />
|
<div className='video-player' style={{ height, width }} />
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
renderLoadingAudioPlayer = () => {
|
renderLoadingAudioPlayer = () => {
|
||||||
const { height, width } = this.props;
|
const { height, width } = this.props;
|
||||||
|
@ -46,7 +46,7 @@ export default class MediaAttachments extends ImmutablePureComponent {
|
||||||
return (
|
return (
|
||||||
<div className='audio-player' style={{ height, width }} />
|
<div className='audio-player' style={{ height, width }} />
|
||||||
);
|
);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { status, width, height, revealed } = this.props;
|
const { status, width, height, revealed } = this.props;
|
||||||
|
|
|
@ -60,14 +60,14 @@ class Item extends React.PureComponent {
|
||||||
if (this.hoverToPlay()) {
|
if (this.hoverToPlay()) {
|
||||||
e.target.play();
|
e.target.play();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseLeave = (e) => {
|
handleMouseLeave = (e) => {
|
||||||
if (this.hoverToPlay()) {
|
if (this.hoverToPlay()) {
|
||||||
e.target.pause();
|
e.target.pause();
|
||||||
e.target.currentTime = 0;
|
e.target.currentTime = 0;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
getAutoPlay() {
|
getAutoPlay() {
|
||||||
return this.props.autoplay || autoPlayGif;
|
return this.props.autoplay || autoPlayGif;
|
||||||
|
@ -91,11 +91,11 @@ class Item extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleImageLoad = () => {
|
handleImageLoad = () => {
|
||||||
this.setState({ loaded: true });
|
this.setState({ loaded: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { attachment, index, size, standalone, letterbox, displayWidth, visible } = this.props;
|
const { attachment, index, size, standalone, letterbox, displayWidth, visible } = this.props;
|
||||||
|
@ -307,11 +307,11 @@ class MediaGallery extends React.PureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.setState({ visible: !this.state.visible });
|
this.setState({ visible: !this.state.visible });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleClick = (index) => {
|
handleClick = (index) => {
|
||||||
this.props.onOpenMedia(this.props.media, index);
|
this.props.onOpenMedia(this.props.media, index);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleRef = (node) => {
|
handleRef = (node) => {
|
||||||
this.node = node;
|
this.node = node;
|
||||||
|
@ -319,11 +319,11 @@ class MediaGallery extends React.PureComponent {
|
||||||
if (this.node) {
|
if (this.node) {
|
||||||
this._setDimensions();
|
this._setDimensions();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
_setDimensions () {
|
_setDimensions () {
|
||||||
const width = this.node.offsetWidth;
|
const width = this.node.offsetWidth;
|
||||||
|
|
||||||
if (width && width != this.state.width) {
|
if (width && width != this.state.width) {
|
||||||
// offsetWidth triggers a layout, so only calculate when we need to
|
// offsetWidth triggers a layout, so only calculate when we need to
|
||||||
if (this.props.cacheWidth) {
|
if (this.props.cacheWidth) {
|
||||||
|
@ -360,7 +360,7 @@ class MediaGallery extends React.PureComponent {
|
||||||
} else if (width) {
|
} else if (width) {
|
||||||
style.height = width / (16/9);
|
style.height = width / (16/9);
|
||||||
} else {
|
} else {
|
||||||
return (<div className={computedClass} ref={this.handleRef}></div>);
|
return (<div className={computedClass} ref={this.handleRef} />);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.isStandaloneEligible()) {
|
if (this.isStandaloneEligible()) {
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { createBrowserHistory } from 'history';
|
||||||
import { multiply } from 'color-blend';
|
import { multiply } from 'color-blend';
|
||||||
|
|
||||||
export default class ModalRoot extends React.PureComponent {
|
export default class ModalRoot extends React.PureComponent {
|
||||||
|
|
||||||
static contextTypes = {
|
static contextTypes = {
|
||||||
router: PropTypes.object,
|
router: PropTypes.object,
|
||||||
};
|
};
|
||||||
|
@ -28,7 +29,7 @@ export default class ModalRoot extends React.PureComponent {
|
||||||
&& !!this.props.children && !this.props.noEsc) {
|
&& !!this.props.children && !this.props.noEsc) {
|
||||||
this.props.onClose();
|
this.props.onClose();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleKeyDown = (e) => {
|
handleKeyDown = (e) => {
|
||||||
if (e.key === 'Tab') {
|
if (e.key === 'Tab') {
|
||||||
|
@ -49,7 +50,7 @@ export default class ModalRoot extends React.PureComponent {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
window.addEventListener('keyup', this.handleKeyUp, false);
|
window.addEventListener('keyup', this.handleKeyUp, false);
|
||||||
|
@ -125,11 +126,11 @@ export default class ModalRoot extends React.PureComponent {
|
||||||
|
|
||||||
getSiblings = () => {
|
getSiblings = () => {
|
||||||
return Array(...this.node.parentElement.childNodes).filter(node => node !== this.node);
|
return Array(...this.node.parentElement.childNodes).filter(node => node !== this.node);
|
||||||
}
|
};
|
||||||
|
|
||||||
setRef = ref => {
|
setRef = ref => {
|
||||||
this.node = ref;
|
this.node = ref;
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { children, onClose } = this.props;
|
const { children, onClose } = this.props;
|
||||||
|
|
|
@ -24,12 +24,12 @@ export default class Permalink extends React.PureComponent {
|
||||||
|
|
||||||
if (this.context.router) {
|
if (this.context.router) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = { ...this.context.router.history.location.state };
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(this.props.to, state);
|
this.context.router.history.push(this.props.to, state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const {
|
const {
|
||||||
|
|
|
@ -22,7 +22,7 @@ class PictureInPicturePlaceholder extends React.PureComponent {
|
||||||
handleClick = () => {
|
handleClick = () => {
|
||||||
const { dispatch } = this.props;
|
const { dispatch } = this.props;
|
||||||
dispatch(removePictureInPicture());
|
dispatch(removePictureInPicture());
|
||||||
}
|
};
|
||||||
|
|
||||||
setRef = c => {
|
setRef = c => {
|
||||||
this.node = c;
|
this.node = c;
|
||||||
|
@ -30,7 +30,7 @@ class PictureInPicturePlaceholder extends React.PureComponent {
|
||||||
if (this.node) {
|
if (this.node) {
|
||||||
this._setDimensions();
|
this._setDimensions();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
_setDimensions () {
|
_setDimensions () {
|
||||||
const width = this.node.offsetWidth;
|
const width = this.node.offsetWidth;
|
||||||
|
|
|
@ -95,7 +95,7 @@ class Poll extends ImmutablePureComponent {
|
||||||
tmp[value] = true;
|
tmp[value] = true;
|
||||||
this.setState({ selected: tmp });
|
this.setState({ selected: tmp });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleOptionChange = ({ target: { value } }) => {
|
handleOptionChange = ({ target: { value } }) => {
|
||||||
this._toggleOption(value);
|
this._toggleOption(value);
|
||||||
|
@ -107,7 +107,7 @@ class Poll extends ImmutablePureComponent {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleVote = () => {
|
handleVote = () => {
|
||||||
if (this.props.disabled) {
|
if (this.props.disabled) {
|
||||||
|
|
|
@ -137,7 +137,7 @@ class ScrollableList extends PureComponent {
|
||||||
}
|
}
|
||||||
this.mouseMovedRecently = false;
|
this.mouseMovedRecently = false;
|
||||||
this.scrollToTopOnMouseIdle = false;
|
this.scrollToTopOnMouseIdle = false;
|
||||||
}
|
};
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
this.attachScrollListener();
|
this.attachScrollListener();
|
||||||
|
@ -154,29 +154,29 @@ class ScrollableList extends PureComponent {
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
getScrollTop = () => {
|
getScrollTop = () => {
|
||||||
return this.props.bindToDocument ? document.scrollingElement.scrollTop : this.node.scrollTop;
|
return this.props.bindToDocument ? document.scrollingElement.scrollTop : this.node.scrollTop;
|
||||||
}
|
};
|
||||||
|
|
||||||
getScrollHeight = () => {
|
getScrollHeight = () => {
|
||||||
return this.props.bindToDocument ? document.scrollingElement.scrollHeight : this.node.scrollHeight;
|
return this.props.bindToDocument ? document.scrollingElement.scrollHeight : this.node.scrollHeight;
|
||||||
}
|
};
|
||||||
|
|
||||||
getClientHeight = () => {
|
getClientHeight = () => {
|
||||||
return this.props.bindToDocument ? document.scrollingElement.clientHeight : this.node.clientHeight;
|
return this.props.bindToDocument ? document.scrollingElement.clientHeight : this.node.clientHeight;
|
||||||
}
|
};
|
||||||
|
|
||||||
updateScrollBottom = (snapshot) => {
|
updateScrollBottom = (snapshot) => {
|
||||||
const newScrollTop = this.getScrollHeight() - snapshot;
|
const newScrollTop = this.getScrollHeight() - snapshot;
|
||||||
|
|
||||||
this.setScrollTop(newScrollTop);
|
this.setScrollTop(newScrollTop);
|
||||||
}
|
};
|
||||||
|
|
||||||
cacheMediaWidth = (width) => {
|
cacheMediaWidth = (width) => {
|
||||||
if (width && this.state.cachedMediaWidth != width) this.setState({ cachedMediaWidth: width });
|
if (width && this.state.cachedMediaWidth != width) this.setState({ cachedMediaWidth: width });
|
||||||
}
|
};
|
||||||
|
|
||||||
getSnapshotBeforeUpdate (prevProps, prevState) {
|
getSnapshotBeforeUpdate (prevProps, prevState) {
|
||||||
const someItemInserted = React.Children.count(prevProps.children) > 0 &&
|
const someItemInserted = React.Children.count(prevProps.children) > 0 &&
|
||||||
|
@ -208,7 +208,7 @@ class ScrollableList extends PureComponent {
|
||||||
|
|
||||||
onFullScreenChange = () => {
|
onFullScreenChange = () => {
|
||||||
this.setState({ fullscreen: isFullscreen() });
|
this.setState({ fullscreen: isFullscreen() });
|
||||||
}
|
};
|
||||||
|
|
||||||
attachIntersectionObserver () {
|
attachIntersectionObserver () {
|
||||||
this.intersectionObserverWrapper.connect({
|
this.intersectionObserverWrapper.connect({
|
||||||
|
@ -256,12 +256,12 @@ class ScrollableList extends PureComponent {
|
||||||
|
|
||||||
setRef = (c) => {
|
setRef = (c) => {
|
||||||
this.node = c;
|
this.node = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
handleLoadMore = e => {
|
handleLoadMore = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.onLoadMore();
|
this.props.onLoadMore();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleLoadPending = e => {
|
handleLoadPending = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -273,7 +273,7 @@ class ScrollableList extends PureComponent {
|
||||||
this.clearMouseIdleTimer();
|
this.clearMouseIdleTimer();
|
||||||
this.mouseIdleTimer = setTimeout(this.handleMouseIdle, MOUSE_IDLE_DELAY);
|
this.mouseIdleTimer = setTimeout(this.handleMouseIdle, MOUSE_IDLE_DELAY);
|
||||||
this.mouseMovedRecently = true;
|
this.mouseMovedRecently = true;
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props;
|
const { children, scrollKey, trackScroll, showLoading, isLoading, hasMore, numPending, prepend, alwaysPrepend, append, emptyMessage, onLoadMore } = this.props;
|
||||||
|
|
|
@ -13,7 +13,7 @@ export default class SettingText extends React.PureComponent {
|
||||||
|
|
||||||
handleChange = (e) => {
|
handleChange = (e) => {
|
||||||
this.props.onChange(this.props.settingPath, e.target.value);
|
this.props.onChange(this.props.settingPath, e.target.value);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { settings, settingPath, label } = this.props;
|
const { settings, settingPath, label } = this.props;
|
||||||
|
|
|
@ -4,6 +4,7 @@ import { FormattedMessage } from 'react-intl';
|
||||||
|
|
||||||
export default
|
export default
|
||||||
class Spoilers extends React.PureComponent {
|
class Spoilers extends React.PureComponent {
|
||||||
|
|
||||||
static propTypes = {
|
static propTypes = {
|
||||||
spoilerText: PropTypes.string,
|
spoilerText: PropTypes.string,
|
||||||
children: PropTypes.node,
|
children: PropTypes.node,
|
||||||
|
@ -11,27 +12,27 @@ class Spoilers extends React.PureComponent {
|
||||||
|
|
||||||
state = {
|
state = {
|
||||||
hidden: true,
|
hidden: true,
|
||||||
}
|
};
|
||||||
|
|
||||||
handleSpoilerClick = () => {
|
handleSpoilerClick = () => {
|
||||||
this.setState({ hidden: !this.state.hidden });
|
this.setState({ hidden: !this.state.hidden });
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { spoilerText, children } = this.props;
|
const { spoilerText, children } = this.props;
|
||||||
const { hidden } = this.state;
|
const { hidden } = this.state;
|
||||||
|
|
||||||
const toggleText = hidden ?
|
const toggleText = hidden ?
|
||||||
<FormattedMessage
|
(<FormattedMessage
|
||||||
id='status.show_more'
|
id='status.show_more'
|
||||||
defaultMessage='Show more'
|
defaultMessage='Show more'
|
||||||
key='0'
|
key='0'
|
||||||
/> :
|
/>) :
|
||||||
<FormattedMessage
|
(<FormattedMessage
|
||||||
id='status.show_less'
|
id='status.show_less'
|
||||||
defaultMessage='Show less'
|
defaultMessage='Show less'
|
||||||
key='0'
|
key='0'
|
||||||
/>;
|
/>);
|
||||||
|
|
||||||
return ([
|
return ([
|
||||||
<p className='spoiler__text'>
|
<p className='spoiler__text'>
|
||||||
|
@ -43,8 +44,9 @@ class Spoilers extends React.PureComponent {
|
||||||
</p>,
|
</p>,
|
||||||
<div className={`status__content__spoiler ${!hidden ? 'status__content__spoiler--visible' : ''}`}>
|
<div className={`status__content__spoiler ${!hidden ? 'status__content__spoiler--visible' : ''}`}>
|
||||||
{children}
|
{children}
|
||||||
</div>
|
</div>,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -55,7 +55,7 @@ export const defaultMediaVisibility = (status, settings) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
return (displayMedia !== 'hide_all' && !status.get('sensitive') || displayMedia === 'show_all');
|
return (displayMedia !== 'hide_all' && !status.get('sensitive') || displayMedia === 'show_all');
|
||||||
}
|
};
|
||||||
|
|
||||||
export default @injectIntl
|
export default @injectIntl
|
||||||
class Status extends ImmutablePureComponent {
|
class Status extends ImmutablePureComponent {
|
||||||
|
@ -121,7 +121,7 @@ class Status extends ImmutablePureComponent {
|
||||||
revealBehindCW: undefined,
|
revealBehindCW: undefined,
|
||||||
showCard: false,
|
showCard: false,
|
||||||
forceFilter: undefined,
|
forceFilter: undefined,
|
||||||
}
|
};
|
||||||
|
|
||||||
// Avoid checking props that are functions (and whose equality will always
|
// Avoid checking props that are functions (and whose equality will always
|
||||||
// evaluate to false. See react-immutable-pure-component for usage.
|
// evaluate to false. See react-immutable-pure-component for usage.
|
||||||
|
@ -136,14 +136,14 @@ class Status extends ImmutablePureComponent {
|
||||||
'expanded',
|
'expanded',
|
||||||
'unread',
|
'unread',
|
||||||
'pictureInPicture',
|
'pictureInPicture',
|
||||||
]
|
];
|
||||||
|
|
||||||
updateOnStates = [
|
updateOnStates = [
|
||||||
'isExpanded',
|
'isExpanded',
|
||||||
'isCollapsed',
|
'isCollapsed',
|
||||||
'showMedia',
|
'showMedia',
|
||||||
'forceFilter',
|
'forceFilter',
|
||||||
]
|
];
|
||||||
|
|
||||||
// If our settings have changed to disable collapsed statuses, then we
|
// If our settings have changed to disable collapsed statuses, then we
|
||||||
// need to make sure that we uncollapse every one. We do that by watching
|
// need to make sure that we uncollapse every one. We do that by watching
|
||||||
|
@ -306,7 +306,9 @@ class Status extends ImmutablePureComponent {
|
||||||
if (this.node && this.props.getScrollPosition) {
|
if (this.node && this.props.getScrollPosition) {
|
||||||
const position = this.props.getScrollPosition();
|
const position = this.props.getScrollPosition();
|
||||||
if (position !== null && this.node.offsetTop < position.top) {
|
if (position !== null && this.node.offsetTop < position.top) {
|
||||||
requestAnimationFrame(() => { this.props.updateScrollBottom(position.height - position.top); });
|
requestAnimationFrame(() => {
|
||||||
|
this.props.updateScrollBottom(position.height - position.top);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -325,7 +327,7 @@ class Status extends ImmutablePureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.setState({ isCollapsed: false });
|
this.setState({ isCollapsed: false });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
setExpansion = (value) => {
|
setExpansion = (value) => {
|
||||||
if (this.props.settings.getIn(['content_warnings', 'shared_state']) && this.props.status.get('hidden') === value) {
|
if (this.props.settings.getIn(['content_warnings', 'shared_state']) && this.props.status.get('hidden') === value) {
|
||||||
|
@ -336,7 +338,7 @@ class Status extends ImmutablePureComponent {
|
||||||
if (value) {
|
if (value) {
|
||||||
this.setCollapsed(false);
|
this.setCollapsed(false);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
// `parseClick()` takes a click event and responds appropriately.
|
// `parseClick()` takes a click event and responds appropriately.
|
||||||
// If our status is collapsed, then clicking on it should uncollapse it.
|
// If our status is collapsed, then clicking on it should uncollapse it.
|
||||||
|
@ -365,17 +367,17 @@ class Status extends ImmutablePureComponent {
|
||||||
status.getIn(['reblog', 'id'], status.get('id'))
|
status.getIn(['reblog', 'id'], status.get('id'))
|
||||||
}`;
|
}`;
|
||||||
}
|
}
|
||||||
let state = {...router.history.location.state};
|
let state = { ...router.history.location.state };
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
router.history.push(destination, state);
|
router.history.push(destination, state);
|
||||||
}
|
}
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleToggleMediaVisibility = () => {
|
handleToggleMediaVisibility = () => {
|
||||||
this.setState({ showMedia: !this.state.showMedia });
|
this.setState({ showMedia: !this.state.showMedia });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleExpandedToggle = () => {
|
handleExpandedToggle = () => {
|
||||||
if (this.props.settings.getIn(['content_warnings', 'shared_state'])) {
|
if (this.props.settings.getIn(['content_warnings', 'shared_state'])) {
|
||||||
|
@ -388,11 +390,11 @@ class Status extends ImmutablePureComponent {
|
||||||
handleOpenVideo = (options) => {
|
handleOpenVideo = (options) => {
|
||||||
const { status } = this.props;
|
const { status } = this.props;
|
||||||
this.props.onOpenVideo(status.get('id'), status.getIn(['media_attachments', 0]), options);
|
this.props.onOpenVideo(status.get('id'), status.getIn(['media_attachments', 0]), options);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleOpenMedia = (media, index) => {
|
handleOpenMedia = (media, index) => {
|
||||||
this.props.onOpenMedia(this.props.status.get('id'), media, index);
|
this.props.onOpenMedia(this.props.status.get('id'), media, index);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyOpenMedia = e => {
|
handleHotkeyOpenMedia = e => {
|
||||||
const { status, onOpenMedia, onOpenVideo } = this.props;
|
const { status, onOpenMedia, onOpenVideo } = this.props;
|
||||||
|
@ -407,84 +409,84 @@ class Status extends ImmutablePureComponent {
|
||||||
onOpenMedia(statusId, status.get('media_attachments'), 0);
|
onOpenMedia(statusId, status.get('media_attachments'), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleDeployPictureInPicture = (type, mediaProps) => {
|
handleDeployPictureInPicture = (type, mediaProps) => {
|
||||||
const { deployPictureInPicture, status } = this.props;
|
const { deployPictureInPicture, status } = this.props;
|
||||||
|
|
||||||
deployPictureInPicture(status, type, mediaProps);
|
deployPictureInPicture(status, type, mediaProps);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyReply = e => {
|
handleHotkeyReply = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.onReply(this.props.status, this.context.router.history);
|
this.props.onReply(this.props.status, this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyFavourite = (e) => {
|
handleHotkeyFavourite = (e) => {
|
||||||
this.props.onFavourite(this.props.status, e);
|
this.props.onFavourite(this.props.status, e);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyBoost = e => {
|
handleHotkeyBoost = e => {
|
||||||
this.props.onReblog(this.props.status, e);
|
this.props.onReblog(this.props.status, e);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyBookmark = e => {
|
handleHotkeyBookmark = e => {
|
||||||
this.props.onBookmark(this.props.status, e);
|
this.props.onBookmark(this.props.status, e);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyMention = e => {
|
handleHotkeyMention = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.onMention(this.props.status.get('account'), this.context.router.history);
|
this.props.onMention(this.props.status.get('account'), this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyOpen = () => {
|
handleHotkeyOpen = () => {
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = { ...this.context.router.history.location.state };
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
const status = this.props.status;
|
const status = this.props.status;
|
||||||
this.context.router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`, state);
|
this.context.router.history.push(`/@${status.getIn(['account', 'acct'])}/${status.get('id')}`, state);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyOpenProfile = () => {
|
handleHotkeyOpenProfile = () => {
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = { ...this.context.router.history.location.state };
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyMoveUp = e => {
|
handleHotkeyMoveUp = e => {
|
||||||
this.props.onMoveUp(this.props.containerId || this.props.id, e.target.getAttribute('data-featured'));
|
this.props.onMoveUp(this.props.containerId || this.props.id, e.target.getAttribute('data-featured'));
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyMoveDown = e => {
|
handleHotkeyMoveDown = e => {
|
||||||
this.props.onMoveDown(this.props.containerId || this.props.id, e.target.getAttribute('data-featured'));
|
this.props.onMoveDown(this.props.containerId || this.props.id, e.target.getAttribute('data-featured'));
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyCollapse = e => {
|
handleHotkeyCollapse = e => {
|
||||||
if (!this.props.settings.getIn(['collapsed', 'enabled']))
|
if (!this.props.settings.getIn(['collapsed', 'enabled']))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.setCollapsed(!this.state.isCollapsed);
|
this.setCollapsed(!this.state.isCollapsed);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHotkeyToggleSensitive = () => {
|
handleHotkeyToggleSensitive = () => {
|
||||||
this.handleToggleMediaVisibility();
|
this.handleToggleMediaVisibility();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleUnfilterClick = e => {
|
handleUnfilterClick = e => {
|
||||||
this.setState({ forceFilter: false });
|
this.setState({ forceFilter: false });
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleFilterClick = () => {
|
handleFilterClick = () => {
|
||||||
this.setState({ forceFilter: true });
|
this.setState({ forceFilter: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleRef = c => {
|
handleRef = c => {
|
||||||
this.node = c;
|
this.node = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
handleTranslate = () => {
|
handleTranslate = () => {
|
||||||
this.props.onTranslate(this.props.status);
|
this.props.onTranslate(this.props.status);
|
||||||
}
|
};
|
||||||
|
|
||||||
renderLoadingMediaGallery () {
|
renderLoadingMediaGallery () {
|
||||||
return <div className='media-gallery' style={{ height: '110px' }} />;
|
return <div className='media-gallery' style={{ height: '110px' }} />;
|
||||||
|
|
|
@ -89,7 +89,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
'showReplyCount',
|
'showReplyCount',
|
||||||
'withCounters',
|
'withCounters',
|
||||||
'withDismiss',
|
'withDismiss',
|
||||||
]
|
];
|
||||||
|
|
||||||
handleReplyClick = () => {
|
handleReplyClick = () => {
|
||||||
const { signedIn } = this.context.identity;
|
const { signedIn } = this.context.identity;
|
||||||
|
@ -99,14 +99,14 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.props.onInteractionModal('reply', this.props.status);
|
this.props.onInteractionModal('reply', this.props.status);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleShareClick = () => {
|
handleShareClick = () => {
|
||||||
navigator.share({
|
navigator.share({
|
||||||
text: this.props.status.get('search_index'),
|
text: this.props.status.get('search_index'),
|
||||||
url: this.props.status.get('url'),
|
url: this.props.status.get('url'),
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
handleFavouriteClick = (e) => {
|
handleFavouriteClick = (e) => {
|
||||||
const { signedIn } = this.context.identity;
|
const { signedIn } = this.context.identity;
|
||||||
|
@ -116,7 +116,7 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.props.onInteractionModal('favourite', this.props.status);
|
this.props.onInteractionModal('favourite', this.props.status);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleEmojiPick = data => {
|
handleEmojiPick = data => {
|
||||||
this.props.onReactionAdd(this.props.status.get('id'), data.native.replace(/:/g, ''), data.imageUrl);
|
this.props.onReactionAdd(this.props.status.get('id'), data.native.replace(/:/g, ''), data.imageUrl);
|
||||||
|
@ -130,78 +130,78 @@ class StatusActionBar extends ImmutablePureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.props.onInteractionModal('reblog', this.props.status);
|
this.props.onInteractionModal('reblog', this.props.status);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleBookmarkClick = (e) => {
|
handleBookmarkClick = (e) => {
|
||||||
this.props.onBookmark(this.props.status, e);
|
this.props.onBookmark(this.props.status, e);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleDeleteClick = () => {
|
handleDeleteClick = () => {
|
||||||
this.props.onDelete(this.props.status, this.context.router.history);
|
this.props.onDelete(this.props.status, this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleRedraftClick = () => {
|
handleRedraftClick = () => {
|
||||||
this.props.onDelete(this.props.status, this.context.router.history, true);
|
this.props.onDelete(this.props.status, this.context.router.history, true);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleEditClick = () => {
|
handleEditClick = () => {
|
||||||
this.props.onEdit(this.props.status, this.context.router.history);
|
this.props.onEdit(this.props.status, this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handlePinClick = () => {
|
handlePinClick = () => {
|
||||||
this.props.onPin(this.props.status);
|
this.props.onPin(this.props.status);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMentionClick = () => {
|
handleMentionClick = () => {
|
||||||
this.props.onMention(this.props.status.get('account'), this.context.router.history);
|
this.props.onMention(this.props.status.get('account'), this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleDirectClick = () => {
|
handleDirectClick = () => {
|
||||||
this.props.onDirect(this.props.status.get('account'), this.context.router.history);
|
this.props.onDirect(this.props.status.get('account'), this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMuteClick = () => {
|
handleMuteClick = () => {
|
||||||
this.props.onMute(this.props.status.get('account'));
|
this.props.onMute(this.props.status.get('account'));
|
||||||
}
|
};
|
||||||
|
|
||||||
handleBlockClick = () => {
|
handleBlockClick = () => {
|
||||||
this.props.onBlock(this.props.status);
|
this.props.onBlock(this.props.status);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleOpen = () => {
|
handleOpen = () => {
|
||||||
let state = {...this.context.router.history.location.state};
|
let state = { ...this.context.router.history.location.state };
|
||||||
if (state.mastodonModalKey) {
|
if (state.mastodonModalKey) {
|
||||||
this.context.router.history.replace(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, { mastodonBackSteps: (state.mastodonBackSteps || 0) + 1 });
|
this.context.router.history.replace(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, { mastodonBackSteps: (state.mastodonBackSteps || 0) + 1 });
|
||||||
} else {
|
} else {
|
||||||
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;
|
||||||
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, state);
|
this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}/${this.props.status.get('id')}`, state);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleEmbed = () => {
|
handleEmbed = () => {
|
||||||
this.props.onEmbed(this.props.status);
|
this.props.onEmbed(this.props.status);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleReport = () => {
|
handleReport = () => {
|
||||||
this.props.onReport(this.props.status);
|
this.props.onReport(this.props.status);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleConversationMuteClick = () => {
|
handleConversationMuteClick = () => {
|
||||||
this.props.onMuteConversation(this.props.status);
|
this.props.onMuteConversation(this.props.status);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleCopy = () => {
|
handleCopy = () => {
|
||||||
const url = this.props.status.get('url');
|
const url = this.props.status.get('url');
|
||||||
navigator.clipboard.writeText(url);
|
navigator.clipboard.writeText(url);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleHideClick = () => {
|
handleHideClick = () => {
|
||||||
this.props.onFilter();
|
this.props.onFilter();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleFilterClick = () => {
|
handleFilterClick = () => {
|
||||||
this.props.onAddFilter(this.props.status);
|
this.props.onAddFilter(this.props.status);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleNoOp = () => {} // hack for reaction add button
|
handleNoOp = () => {} // hack for reaction add button
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@ const textMatchesTarget = (text, origin, host) => {
|
||||||
return (text === origin || text === host
|
return (text === origin || text === host
|
||||||
|| text.startsWith(origin + '/') || text.startsWith(host + '/')
|
|| text.startsWith(origin + '/') || text.startsWith(host + '/')
|
||||||
|| 'www.' + text === host || ('www.' + text).startsWith(host + '/'));
|
|| 'www.' + text === host || ('www.' + text).startsWith(host + '/'));
|
||||||
}
|
};
|
||||||
|
|
||||||
const isLinkMisleading = (link) => {
|
const isLinkMisleading = (link) => {
|
||||||
let linkTextParts = [];
|
let linkTextParts = [];
|
||||||
|
@ -168,8 +168,8 @@ class StatusContent extends React.PureComponent {
|
||||||
link.setAttribute('title', link.href);
|
link.setAttribute('title', link.href);
|
||||||
link.classList.add('unhandled-link');
|
link.classList.add('unhandled-link');
|
||||||
|
|
||||||
link.setAttribute('target', '_blank');
|
link.setAttribute('target', '_blank');
|
||||||
link.setAttribute('rel', 'noopener nofollow noreferrer');
|
link.setAttribute('rel', 'noopener nofollow noreferrer');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (tagLinks && isLinkMisleading(link)) {
|
if (tagLinks && isLinkMisleading(link)) {
|
||||||
|
@ -210,7 +210,7 @@ class StatusContent extends React.PureComponent {
|
||||||
let emoji = emojis[i];
|
let emoji = emojis[i];
|
||||||
emoji.src = emoji.getAttribute('data-original');
|
emoji.src = emoji.getAttribute('data-original');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseLeave = ({ currentTarget }) => {
|
handleMouseLeave = ({ currentTarget }) => {
|
||||||
if (autoPlayGif) {
|
if (autoPlayGif) {
|
||||||
|
@ -223,7 +223,7 @@ class StatusContent extends React.PureComponent {
|
||||||
let emoji = emojis[i];
|
let emoji = emojis[i];
|
||||||
emoji.src = emoji.getAttribute('data-static');
|
emoji.src = emoji.getAttribute('data-static');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
componentDidMount () {
|
componentDidMount () {
|
||||||
this._updateStatusLinks();
|
this._updateStatusLinks();
|
||||||
|
@ -238,13 +238,13 @@ class StatusContent extends React.PureComponent {
|
||||||
if (this.props.collapsed) {
|
if (this.props.collapsed) {
|
||||||
if (this.props.parseClick) this.props.parseClick(e);
|
if (this.props.parseClick) this.props.parseClick(e);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onMentionClick = (mention, e) => {
|
onMentionClick = (mention, e) => {
|
||||||
if (this.props.parseClick) {
|
if (this.props.parseClick) {
|
||||||
this.props.parseClick(e, `/@${mention.get('acct')}`);
|
this.props.parseClick(e, `/@${mention.get('acct')}`);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
onHashtagClick = (hashtag, e) => {
|
onHashtagClick = (hashtag, e) => {
|
||||||
hashtag = hashtag.replace(/^#/, '');
|
hashtag = hashtag.replace(/^#/, '');
|
||||||
|
@ -252,11 +252,11 @@ class StatusContent extends React.PureComponent {
|
||||||
if (this.props.parseClick) {
|
if (this.props.parseClick) {
|
||||||
this.props.parseClick(e, `/tags/${hashtag}`);
|
this.props.parseClick(e, `/tags/${hashtag}`);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseDown = (e) => {
|
handleMouseDown = (e) => {
|
||||||
this.startXY = [e.clientX, e.clientY];
|
this.startXY = [e.clientX, e.clientY];
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseUp = (e) => {
|
handleMouseUp = (e) => {
|
||||||
const { parseClick, disabled } = this.props;
|
const { parseClick, disabled } = this.props;
|
||||||
|
@ -281,7 +281,7 @@ class StatusContent extends React.PureComponent {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.startXY = null;
|
this.startXY = null;
|
||||||
}
|
};
|
||||||
|
|
||||||
handleSpoilerClick = (e) => {
|
handleSpoilerClick = (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
|
@ -291,15 +291,15 @@ class StatusContent extends React.PureComponent {
|
||||||
} else {
|
} else {
|
||||||
this.setState({ hidden: !this.state.hidden });
|
this.setState({ hidden: !this.state.hidden });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleTranslate = () => {
|
handleTranslate = () => {
|
||||||
this.props.onTranslate();
|
this.props.onTranslate();
|
||||||
}
|
};
|
||||||
|
|
||||||
setContentsRef = (c) => {
|
setContentsRef = (c) => {
|
||||||
this.contentsNode = c;
|
this.contentsNode = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const {
|
const {
|
||||||
|
|
|
@ -21,12 +21,12 @@ export default class StatusHeader extends React.PureComponent {
|
||||||
handleClick = (acct, e) => {
|
handleClick = (acct, e) => {
|
||||||
const { parseClick } = this.props;
|
const { parseClick } = this.props;
|
||||||
parseClick(e, `/@${acct}`);
|
parseClick(e, `/@${acct}`);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleAccountClick = (e) => {
|
handleAccountClick = (e) => {
|
||||||
const { status } = this.props;
|
const { status } = this.props;
|
||||||
this.handleClick(status.getIn(['account', 'acct']), e);
|
this.handleClick(status.getIn(['account', 'acct']), e);
|
||||||
}
|
};
|
||||||
|
|
||||||
// Rendering.
|
// Rendering.
|
||||||
render () {
|
render () {
|
||||||
|
|
|
@ -60,22 +60,22 @@ class StatusIcons extends React.PureComponent {
|
||||||
setCollapsed(!collapsed);
|
setCollapsed(!collapsed);
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
mediaIconTitleText (mediaIcon) {
|
mediaIconTitleText (mediaIcon) {
|
||||||
const { intl } = this.props;
|
const { intl } = this.props;
|
||||||
|
|
||||||
switch (mediaIcon) {
|
switch (mediaIcon) {
|
||||||
case 'link':
|
case 'link':
|
||||||
return intl.formatMessage(messages.previewCard);
|
return intl.formatMessage(messages.previewCard);
|
||||||
case 'picture-o':
|
case 'picture-o':
|
||||||
return intl.formatMessage(messages.pictures);
|
return intl.formatMessage(messages.pictures);
|
||||||
case 'tasks':
|
case 'tasks':
|
||||||
return intl.formatMessage(messages.poll);
|
return intl.formatMessage(messages.poll);
|
||||||
case 'video-camera':
|
case 'video-camera':
|
||||||
return intl.formatMessage(messages.video);
|
return intl.formatMessage(messages.video);
|
||||||
case 'music':
|
case 'music':
|
||||||
return intl.formatMessage(messages.audio);
|
return intl.formatMessage(messages.audio);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ export default class StatusList extends ImmutablePureComponent {
|
||||||
|
|
||||||
getFeaturedStatusCount = () => {
|
getFeaturedStatusCount = () => {
|
||||||
return this.props.featuredStatusIds ? this.props.featuredStatusIds.size : 0;
|
return this.props.featuredStatusIds ? this.props.featuredStatusIds.size : 0;
|
||||||
}
|
};
|
||||||
|
|
||||||
getCurrentStatusIndex = (id, featured) => {
|
getCurrentStatusIndex = (id, featured) => {
|
||||||
if (featured) {
|
if (featured) {
|
||||||
|
@ -43,21 +43,21 @@ export default class StatusList extends ImmutablePureComponent {
|
||||||
} else {
|
} else {
|
||||||
return this.props.statusIds.indexOf(id) + this.getFeaturedStatusCount();
|
return this.props.statusIds.indexOf(id) + this.getFeaturedStatusCount();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMoveUp = (id, featured) => {
|
handleMoveUp = (id, featured) => {
|
||||||
const elementIndex = this.getCurrentStatusIndex(id, featured) - 1;
|
const elementIndex = this.getCurrentStatusIndex(id, featured) - 1;
|
||||||
this._selectChild(elementIndex, true);
|
this._selectChild(elementIndex, true);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMoveDown = (id, featured) => {
|
handleMoveDown = (id, featured) => {
|
||||||
const elementIndex = this.getCurrentStatusIndex(id, featured) + 1;
|
const elementIndex = this.getCurrentStatusIndex(id, featured) + 1;
|
||||||
this._selectChild(elementIndex, false);
|
this._selectChild(elementIndex, false);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleLoadOlder = debounce(() => {
|
handleLoadOlder = debounce(() => {
|
||||||
this.props.onLoadMore(this.props.statusIds.size > 0 ? this.props.statusIds.last() : undefined);
|
this.props.onLoadMore(this.props.statusIds.size > 0 ? this.props.statusIds.last() : undefined);
|
||||||
}, 300, { leading: true })
|
}, 300, { leading: true });
|
||||||
|
|
||||||
_selectChild (index, align_top) {
|
_selectChild (index, align_top) {
|
||||||
const container = this.node.node;
|
const container = this.node.node;
|
||||||
|
@ -75,7 +75,7 @@ export default class StatusList extends ImmutablePureComponent {
|
||||||
|
|
||||||
setRef = c => {
|
setRef = c => {
|
||||||
this.node = c;
|
this.node = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { statusIds, featuredStatusIds, onLoadMore, timelineId, ...other } = this.props;
|
const { statusIds, featuredStatusIds, onLoadMore, timelineId, ...other } = this.props;
|
||||||
|
|
|
@ -18,7 +18,7 @@ export default class StatusPrepend extends React.PureComponent {
|
||||||
handleClick = (e) => {
|
handleClick = (e) => {
|
||||||
const { account, parseClick } = this.props;
|
const { account, parseClick } = this.props;
|
||||||
parseClick(e, `/@${account.get('acct')}`);
|
parseClick(e, `/@${account.get('acct')}`);
|
||||||
}
|
};
|
||||||
|
|
||||||
Message = () => {
|
Message = () => {
|
||||||
const { type, account } = this.props;
|
const { type, account } = this.props;
|
||||||
|
@ -106,7 +106,7 @@ export default class StatusPrepend extends React.PureComponent {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { Message } = this;
|
const { Message } = this;
|
||||||
|
@ -137,7 +137,7 @@ export default class StatusPrepend extends React.PureComponent {
|
||||||
case 'update':
|
case 'update':
|
||||||
iconId = 'pencil';
|
iconId = 'pencil';
|
||||||
break;
|
break;
|
||||||
};
|
}
|
||||||
|
|
||||||
return !type ? null : (
|
return !type ? null : (
|
||||||
<aside className={type === 'reblogged_by' || type === 'featured' ? 'status__prepend' : 'notification__message'}>
|
<aside className={type === 'reblogged_by' || type === 'featured' ? 'status__prepend' : 'notification__message'}>
|
||||||
|
|
|
@ -39,7 +39,7 @@ export default class MediaContainer extends PureComponent {
|
||||||
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
|
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
|
||||||
|
|
||||||
this.setState({ media, index });
|
this.setState({ media, index });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleOpenVideo = (options) => {
|
handleOpenVideo = (options) => {
|
||||||
const { components } = this.props;
|
const { components } = this.props;
|
||||||
|
@ -50,7 +50,7 @@ export default class MediaContainer extends PureComponent {
|
||||||
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
|
document.documentElement.style.marginRight = `${getScrollbarWidth()}px`;
|
||||||
|
|
||||||
this.setState({ media: mediaList, options });
|
this.setState({ media: mediaList, options });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleCloseMedia = () => {
|
handleCloseMedia = () => {
|
||||||
document.body.classList.remove('with-modals--active');
|
document.body.classList.remove('with-modals--active');
|
||||||
|
@ -63,11 +63,11 @@ export default class MediaContainer extends PureComponent {
|
||||||
backgroundColor: null,
|
backgroundColor: null,
|
||||||
options: null,
|
options: null,
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
setBackgroundColor = color => {
|
setBackgroundColor = color => {
|
||||||
this.setState({ backgroundColor: color });
|
this.setState({ backgroundColor: color });
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { locale, components } = this.props;
|
const { locale, components } = this.props;
|
||||||
|
|
|
@ -1,3 +1,2 @@
|
||||||
import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
|
import 'abortcontroller-polyfill/dist/abortcontroller-polyfill-only';
|
||||||
import 'intersection-observer';
|
|
||||||
import 'requestidlecallback';
|
import 'requestidlecallback';
|
||||||
|
|
|
@ -59,7 +59,7 @@ class Section extends React.PureComponent {
|
||||||
const { collapsed } = this.state;
|
const { collapsed } = this.state;
|
||||||
|
|
||||||
this.setState({ collapsed: !collapsed }, () => onOpen && onOpen());
|
this.setState({ collapsed: !collapsed }, () => onOpen && onOpen());
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { title, children } = this.props;
|
const { title, children } = this.props;
|
||||||
|
@ -106,7 +106,7 @@ class About extends React.PureComponent {
|
||||||
handleDomainBlocksOpen = () => {
|
handleDomainBlocksOpen = () => {
|
||||||
const { dispatch } = this.props;
|
const { dispatch } = this.props;
|
||||||
dispatch(fetchDomainBlocks());
|
dispatch(fetchDomainBlocks());
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { multiColumn, intl, server, extendedDescription, domainBlocks } = this.props;
|
const { multiColumn, intl, server, extendedDescription, domainBlocks } = this.props;
|
||||||
|
|
|
@ -41,7 +41,7 @@ class Header extends ImmutablePureComponent {
|
||||||
} else if (e.keyCode === 27) {
|
} else if (e.keyCode === 27) {
|
||||||
this.props.onCancelAccountNote();
|
this.props.onCancelAccountNote();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { account, accountNote, isEditing, isSubmitting, intl } = this.props;
|
const { account, accountNote, isEditing, isSubmitting, intl } = this.props;
|
||||||
|
|
|
@ -21,7 +21,7 @@ class ActionBar extends React.PureComponent {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return !location.pathname.match(/\/(followers|following)\/?$/);
|
return !location.pathname.match(/\/(followers|following)\/?$/);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { account, intl } = this.props;
|
const { account, intl } = this.props;
|
||||||
|
@ -32,7 +32,7 @@ class ActionBar extends React.PureComponent {
|
||||||
<div className='account__disclaimer'>
|
<div className='account__disclaimer'>
|
||||||
<Icon id='info-circle' fixedWidth /> <FormattedMessage
|
<Icon id='info-circle' fixedWidth /> <FormattedMessage
|
||||||
id='account.suspended_disclaimer_full'
|
id='account.suspended_disclaimer_full'
|
||||||
defaultMessage="This user has been suspended by a moderator."
|
defaultMessage='This user has been suspended by a moderator.'
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -109,7 +109,7 @@ class Header extends ImmutablePureComponent {
|
||||||
|
|
||||||
openEditProfile = () => {
|
openEditProfile = () => {
|
||||||
window.open(profileLink, '_blank');
|
window.open(profileLink, '_blank');
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseEnter = ({ currentTarget }) => {
|
handleMouseEnter = ({ currentTarget }) => {
|
||||||
if (autoPlayGif) {
|
if (autoPlayGif) {
|
||||||
|
@ -122,7 +122,7 @@ class Header extends ImmutablePureComponent {
|
||||||
let emoji = emojis[i];
|
let emoji = emojis[i];
|
||||||
emoji.src = emoji.getAttribute('data-original');
|
emoji.src = emoji.getAttribute('data-original');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseLeave = ({ currentTarget }) => {
|
handleMouseLeave = ({ currentTarget }) => {
|
||||||
if (autoPlayGif) {
|
if (autoPlayGif) {
|
||||||
|
@ -135,14 +135,14 @@ class Header extends ImmutablePureComponent {
|
||||||
let emoji = emojis[i];
|
let emoji = emojis[i];
|
||||||
emoji.src = emoji.getAttribute('data-static');
|
emoji.src = emoji.getAttribute('data-static');
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleAvatarClick = e => {
|
handleAvatarClick = e => {
|
||||||
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
if (e.button === 0 && !(e.ctrlKey || e.metaKey)) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.props.onOpenAvatar();
|
this.props.onOpenAvatar();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleShare = () => {
|
handleShare = () => {
|
||||||
const { account } = this.props;
|
const { account } = this.props;
|
||||||
|
@ -153,7 +153,7 @@ class Header extends ImmutablePureComponent {
|
||||||
}).catch((e) => {
|
}).catch((e) => {
|
||||||
if (e.name !== 'AbortError') console.error(e);
|
if (e.name !== 'AbortError') console.error(e);
|
||||||
});
|
});
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { account, hidden, intl, domain } = this.props;
|
const { account, hidden, intl, domain } = this.props;
|
||||||
|
@ -177,8 +177,7 @@ class Header extends ImmutablePureComponent {
|
||||||
|
|
||||||
if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) {
|
if (me !== account.get('id') && account.getIn(['relationship', 'followed_by'])) {
|
||||||
info.push(<span className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>);
|
info.push(<span className='relationship-tag'><FormattedMessage id='account.follows_you' defaultMessage='Follows you' /></span>);
|
||||||
}
|
} else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) {
|
||||||
else if (me !== account.get('id') && account.getIn(['relationship', 'blocking'])) {
|
|
||||||
info.push(<span className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>);
|
info.push(<span className='relationship-tag'><FormattedMessage id='account.blocked' defaultMessage='Blocked' /></span>);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -378,7 +377,7 @@ class Header extends ImmutablePureComponent {
|
||||||
{fields.map((pair, i) => (
|
{fields.map((pair, i) => (
|
||||||
<dl key={i}>
|
<dl key={i}>
|
||||||
<dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} />
|
<dt dangerouslySetInnerHTML={{ __html: pair.get('name_emojified') }} title={pair.get('name')} />
|
||||||
|
|
||||||
<dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}>
|
<dd className={pair.get('verified_at') && 'verified'} title={pair.get('value_plain')}>
|
||||||
{pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} className='translate' />
|
{pair.get('verified_at') && <span title={intl.formatMessage(messages.linkVerifiedOn, { date: intl.formatDate(pair.get('verified_at'), dateFormatOptions) })}><Icon id='check' className='verified__mark' /></span>} <span dangerouslySetInnerHTML={{ __html: pair.get('value_emojified') }} className='translate' />
|
||||||
</dd>
|
</dd>
|
||||||
|
|
|
@ -22,20 +22,20 @@ export default class MediaItem extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleImageLoad = () => {
|
handleImageLoad = () => {
|
||||||
this.setState({ loaded: true });
|
this.setState({ loaded: true });
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseEnter = e => {
|
handleMouseEnter = e => {
|
||||||
if (this.hoverToPlay()) {
|
if (this.hoverToPlay()) {
|
||||||
e.target.play();
|
e.target.play();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMouseLeave = e => {
|
handleMouseLeave = e => {
|
||||||
if (this.hoverToPlay()) {
|
if (this.hoverToPlay()) {
|
||||||
e.target.pause();
|
e.target.pause();
|
||||||
e.target.currentTime = 0;
|
e.target.currentTime = 0;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
hoverToPlay () {
|
hoverToPlay () {
|
||||||
return !autoPlayGif && ['gifv', 'video'].indexOf(this.props.attachment.get('type')) !== -1;
|
return !autoPlayGif && ['gifv', 'video'].indexOf(this.props.attachment.get('type')) !== -1;
|
||||||
|
@ -51,7 +51,7 @@ export default class MediaItem extends ImmutablePureComponent {
|
||||||
this.setState({ visible: true });
|
this.setState({ visible: true });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { attachment, displayWidth } = this.props;
|
const { attachment, displayWidth } = this.props;
|
||||||
|
|
|
@ -45,7 +45,7 @@ class LoadMoreMedia extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleLoadMore = () => {
|
handleLoadMore = () => {
|
||||||
this.props.onLoadMore(this.props.maxId);
|
this.props.onLoadMore(this.props.maxId);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
return (
|
return (
|
||||||
|
@ -109,13 +109,13 @@ class AccountGallery extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleHeaderClick = () => {
|
handleHeaderClick = () => {
|
||||||
this.column.scrollTop();
|
this.column.scrollTop();
|
||||||
}
|
};
|
||||||
|
|
||||||
handleScrollToBottom = () => {
|
handleScrollToBottom = () => {
|
||||||
if (this.props.hasMore) {
|
if (this.props.hasMore) {
|
||||||
this.handleLoadMore(this.props.attachments.size > 0 ? this.props.attachments.last().getIn(['status', 'id']) : undefined);
|
this.handleLoadMore(this.props.attachments.size > 0 ? this.props.attachments.last().getIn(['status', 'id']) : undefined);
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleScroll = e => {
|
handleScroll = e => {
|
||||||
const { scrollTop, scrollHeight, clientHeight } = e.target;
|
const { scrollTop, scrollHeight, clientHeight } = e.target;
|
||||||
|
@ -124,7 +124,7 @@ class AccountGallery extends ImmutablePureComponent {
|
||||||
if (150 > offset && !this.props.isLoading) {
|
if (150 > offset && !this.props.isLoading) {
|
||||||
this.handleScrollToBottom();
|
this.handleScrollToBottom();
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleLoadMore = maxId => {
|
handleLoadMore = maxId => {
|
||||||
this.props.dispatch(expandAccountMediaTimeline(this.props.accountId, { maxId }));
|
this.props.dispatch(expandAccountMediaTimeline(this.props.accountId, { maxId }));
|
||||||
|
@ -133,11 +133,11 @@ class AccountGallery extends ImmutablePureComponent {
|
||||||
handleLoadOlder = e => {
|
handleLoadOlder = e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this.handleScrollToBottom();
|
this.handleScrollToBottom();
|
||||||
}
|
};
|
||||||
|
|
||||||
setColumnRef = c => {
|
setColumnRef = c => {
|
||||||
this.column = c;
|
this.column = c;
|
||||||
}
|
};
|
||||||
|
|
||||||
handleOpenMedia = attachment => {
|
handleOpenMedia = attachment => {
|
||||||
const { dispatch } = this.props;
|
const { dispatch } = this.props;
|
||||||
|
@ -153,13 +153,13 @@ class AccountGallery extends ImmutablePureComponent {
|
||||||
|
|
||||||
dispatch(openModal('MEDIA', { media, index, statusId }));
|
dispatch(openModal('MEDIA', { media, index, statusId }));
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
handleRef = c => {
|
handleRef = c => {
|
||||||
if (c) {
|
if (c) {
|
||||||
this.setState({ width: c.offsetWidth });
|
this.setState({ width: c.offsetWidth });
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { attachments, isLoading, hasMore, isAccount, multiColumn, suspended } = this.props;
|
const { attachments, isLoading, hasMore, isAccount, multiColumn, suspended } = this.props;
|
||||||
|
|
|
@ -37,35 +37,35 @@ export default class Header extends ImmutablePureComponent {
|
||||||
|
|
||||||
handleFollow = () => {
|
handleFollow = () => {
|
||||||
this.props.onFollow(this.props.account);
|
this.props.onFollow(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleBlock = () => {
|
handleBlock = () => {
|
||||||
this.props.onBlock(this.props.account);
|
this.props.onBlock(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMention = () => {
|
handleMention = () => {
|
||||||
this.props.onMention(this.props.account, this.context.router.history);
|
this.props.onMention(this.props.account, this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleDirect = () => {
|
handleDirect = () => {
|
||||||
this.props.onDirect(this.props.account, this.context.router.history);
|
this.props.onDirect(this.props.account, this.context.router.history);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleReport = () => {
|
handleReport = () => {
|
||||||
this.props.onReport(this.props.account);
|
this.props.onReport(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleReblogToggle = () => {
|
handleReblogToggle = () => {
|
||||||
this.props.onReblogToggle(this.props.account);
|
this.props.onReblogToggle(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleNotifyToggle = () => {
|
handleNotifyToggle = () => {
|
||||||
this.props.onNotifyToggle(this.props.account);
|
this.props.onNotifyToggle(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleMute = () => {
|
handleMute = () => {
|
||||||
this.props.onMute(this.props.account);
|
this.props.onMute(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleBlockDomain = () => {
|
handleBlockDomain = () => {
|
||||||
const domain = this.props.account.get('acct').split('@')[1];
|
const domain = this.props.account.get('acct').split('@')[1];
|
||||||
|
@ -73,7 +73,7 @@ export default class Header extends ImmutablePureComponent {
|
||||||
if (!domain) return;
|
if (!domain) return;
|
||||||
|
|
||||||
this.props.onBlockDomain(domain);
|
this.props.onBlockDomain(domain);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleUnblockDomain = () => {
|
handleUnblockDomain = () => {
|
||||||
const domain = this.props.account.get('acct').split('@')[1];
|
const domain = this.props.account.get('acct').split('@')[1];
|
||||||
|
@ -81,31 +81,31 @@ export default class Header extends ImmutablePureComponent {
|
||||||
if (!domain) return;
|
if (!domain) return;
|
||||||
|
|
||||||
this.props.onUnblockDomain(domain);
|
this.props.onUnblockDomain(domain);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleEndorseToggle = () => {
|
handleEndorseToggle = () => {
|
||||||
this.props.onEndorseToggle(this.props.account);
|
this.props.onEndorseToggle(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleAddToList = () => {
|
handleAddToList = () => {
|
||||||
this.props.onAddToList(this.props.account);
|
this.props.onAddToList(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleEditAccountNote = () => {
|
handleEditAccountNote = () => {
|
||||||
this.props.onEditAccountNote(this.props.account);
|
this.props.onEditAccountNote(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleChangeLanguages = () => {
|
handleChangeLanguages = () => {
|
||||||
this.props.onChangeLanguages(this.props.account);
|
this.props.onChangeLanguages(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleInteractionModal = () => {
|
handleInteractionModal = () => {
|
||||||
this.props.onInteractionModal(this.props.account);
|
this.props.onInteractionModal(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
handleOpenAvatar = () => {
|
handleOpenAvatar = () => {
|
||||||
this.props.onOpenAvatar(this.props.account);
|
this.props.onOpenAvatar(this.props.account);
|
||||||
}
|
};
|
||||||
|
|
||||||
render () {
|
render () {
|
||||||
const { account, hidden, hideTabs } = this.props;
|
const { account, hidden, hideTabs } = this.props;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue