Commit graph

136 commits

Author SHA1 Message Date
jessopb
049fb2878e
recsys v0.2 (#6977)
* recsys wip

better logging

fix floating player popout playing uri bug with recsys

lint

add empty entries to create

use beacon; fire on visibilitychange

cleanup, not record recs if not seen

ifweb recsys beacon

recsys handle embeds, cleanup

use history.listen to trigger events

fix recsys embed bug

bugfix

more default data

cleaner

cleaner

* remove tentative

* disable recsys debug logging
2021-09-02 18:39:40 -04:00
saltrafael
64cbd4ae8d
Expanded Playback and List controls (#6921)
* Dont show countdown on Lists

* Add Repeat icon

* Add Shuffle icon

* Add Replay Icon

* Add Replay Option to autoplayCountdown

* Add Loop Control for Lists

* Add Shuffle control for Lists

* Improve View List Link and Fetch action

* Add Play Button to List page

* Add Shuffle Play Option on List Page and Menus

* Fix Modal Remove Collection I18n

* CSS: Fix Large list titles

* Fix List playback on Floating Player

* Add Theater Mode to its own class and fix bar text display

* Add Play Next VJS component

* Add Play Next Button

* Add Play Previous VJS Component

* Add Play Previous Button

* Add Autoplay Next Button

* Add separate control for autoplay next in list

* Bump redux

* Update CHANGELOG.md
2021-09-02 16:05:32 -04:00
infinite-persistence
74986a8b3a
Comments: simplify blocked replies display
Previously, we decide when to display "Show More" based on the current fetched reply count vs. total replies in Commentron. It was already troublesome as `comment.List` and `comment.replies` give different values (one includes blocked content, while another does not).

Now, we are further filtering the list with Commentron blocklists (personal, admin, moderator), so it is not feasible to run the logic based on reply count.

## Solution
- Keep track of number of remaining pages instead and use that to determine when to display "Show More".
  - While it doesn't solve the "Show N replies" mismatch (YT has this problem too), it prevents the button from lingering.
- In the event that all replies are blocked, just show an empty space (same as YT). I didn't like the previous version that cluttered the space with "comment(s) blocked".
2021-08-24 16:55:36 +08:00
infinite-persistence
882c9ca022 Fix double linked-comment if it was also pinned
## Issue
If the linked-comment is also a pinned comment, it was displayed twice.

## Fix
When separating out pinned comments, I forgot that `comment.ByID` was another place where we fetch comments.
2021-08-19 02:22:33 -07:00
infinite-persistence
4688b4bf58
Livestream: stop pinned comments from appearing as latest (#6888)
## Ticket
6879: Previously pinned livestream comments show as latest

## Issue
`comment.List` will always display the pinned comment first, hence the problem when the chat is refreshed.

## Approach
Completely split pinned comments from top-level comments in the Reducer, and the let the GUI (e.g. regular comments, livestream comments) decide how they want to display it.

For the case of livestream, there is no need to repeat the pinned comments in the regular chat area, since there is a dedicated area on top.
2021-08-17 12:09:55 -04:00
jessopb
5f55603fb2
send recsys powered-by (#6875)
* send recsys powered-by

* update lighthouse call in useLighthouse

* rename select selectors

* update channel search too
2021-08-17 10:03:25 -04:00
infinite-persistence
474da87c11
Commentron: min tip API now uses float again 2021-08-12 14:51:41 +08:00
infinite-persistence
e9a2f44899
Commentron: incorporate 'setting.Get' into 'doFetchCreatorSettings'
## General
- `setting.List`: returns full creator settings. Requires signature (i.e. you own the channel)
- `setting.Get`: returns a public subset of the creator settings. No signature required, and it is mainly used by the GUI to determine the constraints of a channel (e.g. comments enabled? min tip requirements? etc.). Does not include private settings like "blocked words list".

`doFetchCreatorSettings` will handle both of these. Clients that uses the stashed results (`settingsByChannelId`) just needs to be aware the result might not contain everything, depending on whether you own the channel or not.

## Misc Related Changes
- Finally fix the reducer for COMMENT_FETCH_SETTINGS_COMPLETED to not purge the data on each call.
- Change `doFetchCreatorSettings` to operate on a single channel instead of multiple. We ended up not using the multple mode anyway, so it was wasteful code trying to batch the promises.
- `commentsDisabledChannelIds` is no longer needed. Previously, this was created just to differentiate between Creator (full) and Channel (subset) settings. It's cleaner to just use one object, so eliminated this.
- Remove unused 'commentingEnabled'.

## Aside
- There are now 2 ways to know if a channel has disabled comments: (1) from `comment.list` and `setting.Get|List`. Both of them updates `settingsByChannelId`, so it'll still be a single place for the GUI to check against.
2021-08-12 14:51:41 +08:00
infinite-persistence
658e9bd1db
Enable min_tip setting 2021-08-12 14:51:40 +08:00
infinite-persistence
ff9ca662f2
Option to change commments-server (desktop)
## Issue
> 5459 Add setting for changing your comment server. Visible on desktop (and possibly defaulting to Odysee URL), hidden on odysee.

## Comments
Not sure how this would actually work properly without the user recompiling the app to handle server differences. For example, even when we use our own server but switch between v1 and v2, some code changes are need to handle the differences. At that point, it seems easier for the user to just change the .env file? Anyway...

## Changes
- Added Desktop-only options to define custom server. [Settings > Advanced Settings > "Comment server" section].
2021-08-12 14:01:22 +08:00
infinite-persistence
4731786a3f
Livestream: implement Pinned Comments 2021-08-12 10:39:21 +08:00
infinite-persistence
34368760de Fill in remaining Recsys fields
## Issue
6366 Recsys Evaluation Telemetry

The recommended list from lighthouse is obtained from `makeSelectRecommendedContentForUri`. This list is further tweaked by the GUI (e.g. move autoplay next item to top, remove blocked content, etc.). Recsys wants the final recommendation list and the clicked index (in exact order), so we need pass these info to the videojs recsys plugin somehow. Also, Recsys wants a recommendation list ID as well as the parent (referrer) ID, we so need to track the clicks and navigation.

## General Approach
- It seems easiest to just spew back the final (displayed) list and all the required info to Redux, and the recsys plugin (or anyone else in the future) can grab it.
- Try to touch few files as possible. The dirty work should all reside in `<RecommendedContent>` only.

## Changes
- `ClaimPreview`: add optional parameters to store an ID of the container that it is in (for this case, it is `ClaimList`) as well as the index within the container.
  - When clicked, we store the container ID in the navigation history `state` object.
    - For general cases, anyone can check this state from  `history.location.state` to know which container referred/navigated to the current page. For the recsys use case, we can use this as the `parentUUID`.
- `ClaimList`: just relay `onClick` and set IDs.
- `RecommendedContent`: now handles the uuid generation (for both parent and child) and stores the data in Redux.
2021-08-03 09:34:36 -04:00
zeppi
ad3fd5700f default search types from config 2021-07-23 10:31:07 -04:00
infinite-persistence
6e402240b0
Fix muted-words now returning null instead of ""
## Issue
Creating Settings suddenly start to stop loading correctly for some of my channels.

## Change
`settings.List` now returns null instead of empty array. Double-checked the Commentron repo and this is indeed the case.

Updated the code to handle null.
2021-07-23 15:46:38 +08:00
infinite-persistence
e5f32b21c4
Reaction-fetch: handle "no results"
If there are no API errors but no reactions returned, consider the requested IDs as "done" and stop requesting again. When a channel is being confirmed, Commentron doesn't return the reaction object.

Also added extra guard in case Commentron does return an object in the future, but an empty one.
2021-07-20 15:22:51 +08:00
zeppi
9b03f5a1d0 more 2021-07-19 13:52:15 -04:00
infinite-persistence
abe32e5f5c
Revert "Reactions: consider failures as "fetched""
This reverts commit 84a2a74c8c.
2021-07-18 10:55:11 +08:00
infinite-persistence
84a2a74c8c
Reactions: consider failures as "fetched"
In the event that Commentron returned an empty object, we'll end up re-requesting the same IDs again. Haven't seens this happen before, but since we don't know what's causing the spike, we'll just consider failures and "fetched" to stop the loop.

User can always click Refresh to repopulate the values.
2021-07-17 21:53:23 +08:00
infinite-persistence
a13708f4dd Handle the case of all replies are blocked.
In this scenario, `comment.List` does not return `comment`. I was expecting an empty array.

Handled accordingly.
2021-07-16 10:54:12 -04:00
infinite-persistence
08c701ba19 Restore comment pagination
This reverts commit e6addb8c2a, reversing
changes made to 47b594107a.
2021-07-16 10:54:12 -04:00
zeppi
b2b88b466e fix colon handling 2021-07-15 17:48:02 -04:00
infinite-persistence
a2a1ddb403
Revert "Comments Pagination #6390"
This reverts commit 16ef013025, reversing
changes made to fba8b89b3b.
2021-07-15 22:23:26 +08:00
infinite-persistence
f8bdd0704f
Handle temporary Commentron bugs
Can be removed when bugs are fixed, but would still work if left there.
2021-07-14 12:58:27 +08:00
infinite-persistence
0cf6fe3df5
Comments Pagination
## Issue
6158 - Support Comment Pagination
2021-07-14 12:58:25 +08:00
infinite-persistence
b4b45ffbdc Commentron Moderation Delegation API 2021-06-18 15:46:51 -04:00
infinite-persistence
d6ac2c7954 Comments: enable 'enable_comments' flag
## Issue
Closes 6159 "Support Comments Enabled/Disabled for comment.List API"

## New behavior
- `disable-comments` tag will block the comments component entirely.
- `settings.commentsEnabled`:
  - When false, will pause comment fetching, posting and replying.
  - Any already-fetched comments will stay on screen (unless user reloads/F5).
2021-06-18 15:46:51 -04:00
zeppi
03e921e6df use commentron for live view counts 2021-06-17 14:58:55 -04:00
infinite-persistence
15015dacd7 Performance: don't spread in 'reduce' 2021-06-02 08:21:43 +08:00
infinite-persistence
54b17ee739 Commentron Settings API 2021-05-26 15:38:29 -04:00
Sean Yesmunt
3808c61148 fetch notofication/categories for notification types dropdown 2021-04-30 12:45:46 -04:00
zeppi
b9fc9b6319 allow unsubscribe from deleted channels by navigating from sidebar 2021-04-30 11:06:34 -04:00
Sean Yesmunt
d4fa45b257 fix hyperchat size when thumbanil is gif and fix totalAmount calculation 2021-04-26 00:32:52 -04:00
Sean Yesmunt
6d89f0df7e hyperchats 2021-04-23 16:20:17 -04:00
zeppi
bd62a55608 review 2021-04-23 14:51:09 -04:00
zeppi
f3463ebdeb use redux for livestream claim setup 2021-04-23 14:51:09 -04:00
infinite-persistence
bcbb1c8185 Add 'ReportContent' actions/reducers/selectors 2021-04-21 10:49:31 -04:00
infinite-persistence
f94f98e0f3 ViewPastSwaps: limit to 10 entries + other fixes
(1) Due to IAPI/commerce query limit, and also to not pollute the wallet with infinite chargeCodes, we'll only show the last 10 swaps. Beamer mentioned that it's possible to tracked back the past chargeCodes of the user, and potential provide a `list` endpoint to handle disputes.

(2) If a user explicitly removed an entry, don't repopulate that entry even if websocket returned an updated status for it. While it might be useful to handle accidental removals, it looks weird when the list gets repopulated with 'Expired' entries.

(3) Add sanitization when repopulating the chargeCodes from the wallet data (i.e. remove 'null' entries).

(4) Always repopulate the list per wallet data so every instance looks the same.
2021-04-13 14:02:25 -04:00
infinite-persistence
7cf5c1f6fe CoinSwap: websocket + multi-coin
- For the active swap, switch from polling to websocket. The returned data is now the Charge data from the commerce, so some parsing will be required.

- Allow the user to send other coins that the commerce supports.

- Only save the 'chargeCode' to the wallet. The other data can be repopulated from this.

- Store the receipt currency. I'm not sure if the commerce supports sending bits from various coins. Take the coin that came with the 'COMPLETED' message for now.

- Fix 'lbc' calculation to match IAPI side.

- Allow users to see full detauls from "View Past Swaps".

- String cleanup

- GUI cleanup.
2021-04-13 14:02:25 -04:00
infinite-persistence
b2630f6f21 Save entire swap info instead of just the address.
- Users should be able to see the entered and promised amount, otherwise they might forget how much to send over.
- This change also prepares for the future upgrade to support multiple coins.
2021-04-13 14:02:25 -04:00
infinite-persistence
9c808e2b5e Implement Swap BTC page 2021-04-13 14:02:25 -04:00
infinite-persistence
b8ec0c9967 Augment doNotificationList to get a filtered list.
Initially, the filtered list was done at the component level, and the list was simply a subset of `notifications`. But due to the limit issue explained in 5694, we now query the filtered list instead.

Considerations:
- The filtered list could contain items not listed in the 'All' list. We could add a string at the bottom of 'All' that says "not all items retrieved" if this confuses the user.
- The unseen count needs to be based on 'All' and not the filtered one, so that data needs to be stashed somehow (can't re-use the array).

Use 2 arrays for now instead of trying to accumulate "all" and "filtered" into 1 array.
2021-04-08 14:28:21 -04:00
infinite-persistence
8111b8d9dc Only concatenate results if 'from !== 0' 2021-04-07 12:08:17 -04:00
infinite-persistence
855ae15a27 Search: infinite scroll 2021-04-07 12:08:17 -04:00
Stefan Sundin
039264531f Add 24-hour clock setting. 2021-04-06 13:00:10 -04:00
Sean Yesmunt
3644eed49b fix first livestream comment not being displayed 2021-03-22 15:30:13 -07:00
infinite-persistence
1e4c79cf06 Don't clear all notifications when only 1 is clicked.
## Issue:
Closes 5515: All videos marked as read when clicking a single notification from notification list

## Change:
- Augment `doReadNotifications` to only clear the given IDs. If the argument is `null` or is not a valid array (e.g. when used as a click handlers, the click event object is passed in), all notifications will be cleared.

- Augment `NOTIFICATION_READ_COMPLETED` to only clear the given IDs.

## Notes:
- Wasn't sure of the API will fail if the ID is invalid, so I start from `unreadNotifications` first, then only filtering it further with the given ID. Otherwise, we could just skip the `unreadNotifications` filtering.
2021-03-08 11:41:04 -05:00
infinite-persistence
2e49421960 Lint - separated commit to make the next diff clearer 2021-03-08 11:41:04 -05:00
Sean Yesmunt
ea74a66dbd
New moderation tools: block & mute (#5572)
* initial support for block/mute

* hide blocked + muted content everywhere

* add info message for blocked/muted characteristics

* sort blocked list by most recent block first

* add 'blocked' message on channel page for channels that you have blocked

* cleanup

* delete unused files

* always pass mute/block list to claim_search on homepage

* PR cleanup
2021-03-03 13:50:16 -05:00
Sean Yesmunt
1f117e43bd add initial support for comment API outside of SDK 2021-02-11 10:45:34 -05:00
Sean Yesmunt
db87125dc8 refactor 'active' channel usage across the app 2021-02-11 10:45:34 -05:00