* Restore hashtag suggestions from local tag history
* Append local hashtag suggestions instead of prepending them
* Do not display inaccurate usage statistics for hashtags not retrieved from API
* Fixup
* Allow selecting menu items with the space bar in status dropdown menus
* Fix modals opened by keyboard navigation being immediately closed
* Fix menu items triggering modal actions
* Add Tab trapping inside dropdown menu
* Give focus back to last focused element when status dropdown menu closes
* Optimize makeGetStatus
Because `ImmutableList.filter` always returns a new object and `createSelector`
memoizes based on object identity, the selector returned by `makeGetStatus`
would *always* execute.
To avoid that, we wrap `getFilters` into a new memoizer that memoizes based on
deep equality, thus returning the same object as long as the filters haven't
changed, allowing the memoization of `makeGetStatus` to work.
Furthermore, we memoize the compiled regexs instead of recomputing them each
time the selector is called.
* Fix memoized result being cleared too often
* Make notifications use memoized getFiltersRegex
In some occasions, such as the browser or a browser extension auto-filling
the existing but disabled/hidden CW field, a CW can be set without the user
knowing.
* Improvements to the single column layout
- Add follows and followers link to the right panel
- Increase margins around separators in right panel
- Add follow requests link with counter when account is locked to right panel
* Redirect from getting started to home when navigation panel is visible
* Add responsive panels to the single-column layout
* Fixes
* Fix not being able to save the preference
* Fix code style issues
* Set max-height on the compose textarea and add a link to relationship manager
* Return Status with raw text in raw_content when deleting a status
* Use raw content if available on delete & redraft
* Rename raw_content to text; do not serialize formatted content when source is requested
* Refactor selectComposeSuggestion so that different paths can be updated
* Add suggestions in CW field
* Add emoji suggestion to poll options
* Attempt to fix CSS
* Hide suggestions by default
They will be enabled if the input has focus
The search API now supports returning more results and pagination,
but until the web UI implements pagination, it makes no sense to
dump so many results at once. This fix restores the behaviour
before the API change
* Backend changes for custom emoji support in poll options
* Serialize poll emojis in REST API
* Render custom emojis in poll options
* Render custom emoji in poll options on public pages
The active filter is stored in the web app's settings, but no save
is explicitly triggered, meaning that it is only saved when a different
setting is changed.
* Process incoming poll tallies update
* Send Update on poll vote
* Do not send Updates for a poll more often than once every 3 minutes
* Include voters in people to notify of results update
* Schedule closing poll worker on poll creation
* Add new notification type for ending polls
* Add front-end support for ended poll notifications
* Fix UpdatePollSerializer
* Fix Updates not being triggered by local votes
* Fix tests failure
* Fix web push notifications for closing polls
* Minor cleanup
* Notify voters of both remote and local polls when those close
* Fix delivery of poll updates to mentioned accounts and voters
* Add polls
Fix#1629
* Add tests
* Fixes
* Change API for creating polls
* Use name instead of content for votes
* Remove poll validation for remote polls
* Add polls to public pages
* When updating the poll, update options just in case they were changed
* Fix public pages showing both poll and other media
The `hasMore` property of timelines in redux store was set whenever an API
request returned only one page of results, *even* if the query only requested
newer conversations (using `since_id`), causing `hasMore` to be incorrectly set to
false whenever fetching new toots in the direct timeline, which happens each time
the direct message column is opened.
(Basically #9516 for direct messages)
* Allow drag and drop uploads of multiple files to compose
* Calculate aggregate upload progress for single action
* Allow multiple uploads to compose through traditional input, consolidate update file limit logic, provide file limit feedback
* Prepare to load onboarding as a full page
* Update the first-time introduction
* Improve responsive design
* Replace speech bubble with logo
* Increase text size and reword first paragraph
* create FilterBar componer and its container, unstyled
* introduce basic styling for FilterBar
* add selection css
* allow FilterBar to display active CSS with js
* connect the FilterBar to the Redux state
* change getNotifications to use filter
* remove temporary comments
* add an option to turn the FilterBar off in settings
* fix showFilterBar data type to boolean
* fix eslint errors
* add English and Polish translations
* allowed filter bar overflow to accomodate for longer languages
* fix mispelled translation key
* add unified CSS look
* replace text in FilterBar with icons
* add tooltips
* replace text @ with an icon
* introduce simple and advanced filtering view
* add ability to toggle the advanced view
* add Polish translations
* change Advanced View description to be more clear
* make each filter flush notifications and load new ones, fixing pagination
* simplify getNotifications once frontend filtering is not needed for FilterBar
* add a semicolon
* Revert "simplify getNotifications once frontend filtering is not needed for FilterBar"
This reverts commit 9f4be7857135b0327814bd22a3e8a4e7b546f7cc.
* reset filter to 'all' when turning off FilterBar
The `hasMore` property of timelines in redux store was set whenever an API
request returned only one page of results, *even* if the query only requested
newer statuses (using `since_id`), causing `hasMore` to be incorrectly set to
false whenever fetching new toots in a timeline, which happens each time
an account's timeline or media gallery is visited.
* Use global loading indicator when loading more items
* Use local loading indicator for notifications
And remove global loading indicator for initial custom emojis load
So that opening a profile feels faster. Also, pinned toots are not
shown before other toots have loaded. Also, if no toots are loaded,
added empty message
* Eliminate extra accounts select query from FollowService
* Optimistically update follow state in web UI and hide loading bar
Fix#6205
* Asynchronize NotifyService in FollowService
And fix failing test
* Skip Webfinger resolve routine when called from FollowService if possible
If an account is ActivityPub, then webfinger re-resolving is not necessary
when called from FollowService. Improve options of ResolveAccountService
* Nascent tag menu on frontend
* Hook up frontend to search
* Tag intersection backend first pass
* Update yarnlock
* WIP
* Fix for tags not searching correctly
* Make radio buttons function
* Simplify radio buttons with modeOption
* Better naming
* Rearrange options
* Add all/any/none functionality on backend
* Small PR cleanup
* Move to service from scope
* Small cleanup, add proper service tests
* Don't use send with user input :D
* Set appropriate column header
* Handle auto updating timeline
* Fix up toggle function
* Use tag value correctly
* A bit more correct to use 'self' rather than 'all' in status scope
* Fix some style issues
* Fix more code style issues
* Style select dropdown more better
* Only use to_id'ed value to ensure no SQL injection
* Revamp frontend to allow for multiple selects
* Update backend / col header to account for more flexible tagging
* Update brakeman ignore
* Codeclimate suggestions
* Fix presenter tag_url
* Implement initial PR feedback
* Handle additional tag streaming
* CodeClimate tweak
Reminder: Suggestions were added in #7918 and are based on who you
interact with who you do not follow. E.g. if you boost someone a lot
from seeing other people's boosts of that person, it makes sense you
might be interested in following the original source; or if you reply
to someone a lot, maybe you'd want to follow them
Each suggestion can be dismissed
* Add conversations API
* Add web UI for conversations
* Add test for conversations API
* Add tests for ConversationAccount
* Improve web UI
* Rename ConversationAccount to AccountConversation
* Remove conversations on block and mute
* Change last_status_id to be a denormalization of status_ids
* Add optimistic locking
* Add keyword filtering
GET|POST /api/v1/filters
GET|PUT|DELETE /api/v1/filters/:id
- Irreversible filters can drop toots from home or notifications
- Other filters can hide toots through the client app
- Filters use a phrase valid in particular contexts, expiration
* Make sure expired filters don't get applied client-side
* Add missing API methods
* Remove "regex filter" from column settings
* Add tests
* Add test for FeedManager
* Add CustomFilter test
* Add UI for managing filters
* Add streaming API event to allow syncing filters
* Fix tests
* Action/reducer for changing column settings takes a path and a value
instead of a javascript object
* Settings menu version and column headline version working simultaneously
* remove column headline entirely
* remove css for headlines that aren't possible now
* Remove commented out code from unfruitful attempt at this feature
* Give direct timeline its own column settings bc it doesn't have a media only option
* Fix typo in public timeline code that was preventing per-column settings from working properly
* Fix codeclimate issues
* Missing semicolons
* Use redux state to set onlyMedia, let that do the update instead of a callback. Consequently, unpinned setting works without history modification
* Unused import
* Track trending tags
- Half-life of 1 day
- Historical usage in daily buckets (last 7 days stored)
- GET /api/v1/trends
Fix#271
* Add trends to web UI
* Don't render compose form on search route, adjust search results header
* Disqualify tag from trends if it's in disallowed hashtags setting
* Count distinct accounts using tag, ignore silenced accounts
> Good lord what is happening in there
Previously the contents of the Web Push API payloads closely resembled the structure of JavaScript's [Notification](https://developer.mozilla.org/en-US/docs/Web/API/Notification). But now that the API is open to non-browser apps, and given that there is no required coupling between contents of the payload and a Notification object, here is how I changed the payload:
```json
{
"access_token": "...",
"preferred_locale": "en",
"notification_id": "12345",
"notification_type": "follow",
"title": "So and so followed you",
"body": "This is my bio",
"icon": "https://example.com/avatar.png"
}
```
The title, body and icon attributes are included as a fallback so you can construct a minimal notification if you cannot perform a network request to the API to get more data.
- Use URL.createObjectURL (replace from FileReader)
- Use HTMLCanvasElement.prototype.toBlob
(replace from HTMLCanvasElement.prototype.toDataURL)
- Use Promise (replace callback interface)
* Added a timeline for Direct statuses
* Lists all Direct statuses you've sent and received
* Displayed in Getting Started
* Streaming server support for direct TL
* Changes to match other timelines in 2.0
* Add bio fields
- Fix#3211
- Fix#232
- Fix#121
* Display bio fields in web UI
* Fix output of links and missing fields
* Federate bio fields over ActivityPub as PropertyValue
* Improve how the fields are stored, add to Edit profile form
* Add rel=me to links in fields
Fix#121
* Add eslint-plugin-promise to detect uncaught rejections
* Move alert generation for errors to actions/alert
* Add missing rejection handling for Promises
* Use catch() instead of onReject on then()
Then it will catches rejection from onFulfilled. This detection can be
disabled by `allowThen` option, though.
* Keep list of blocked domains
Might be overkill, but I'm trying to follow the same logic as for blocked users
* Add basic domain block UI
* Add the domain blocks UI to Getting Started
* Fix undefined URL in `fetchDomainBlocks`
* Update all known users' domain_blocking relationship instead of just one's