Compare commits

..
Author SHA1 Message Date
Wyatt Johnson 5acac741e4 fix: improve performance 2020-08-14 09:52:02 -06:00
Wyatt Johnson 8c6c8c1f72 fix: updated snaps 2020-08-14 09:52:01 -06:00
Wyatt Johnson 3d9f8bd9ea feat: implmentation with Redis 2020-08-14 09:52:01 -06:00
Wyatt Johnson 27d6f1c245 feat: initial impl 2020-08-14 09:52:00 -06:00
Wyatt Johnson f41623bbd4 feat: added useLive hook 2020-08-14 09:51:27 -06:00
Tessa Thorntonandkodiakhq[bot] abfcdcc933 [CORL-1249] Add "warn" status (#3100)
* schema and backend for warning users

* allow warning and warning acknowledgement

* include warning actions in user history drawer

* fix fixture

* add copy to warn modal

* style warning on stream side

* localize strings

* update warning form

* fix fixtures

* copy updates

* clean up error messaging

* userefetch for users

* ensure user status is refreshed on warn error

* add details about warning to user status details

* update copy for unacknowledged warning

* fix merge conflict

* update copy

* remove unused code

* clean up warning css

* sort imports

* fix copy in comments

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-14 15:44:35 +00:00
Wyatt Johnsonandkodiakhq[bot] d001fcd456 [CORL-1291] Logging Improvements (#3103)
* feat: added settings audit

* fix: added tenantID to audit entry

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-14 15:30:32 +00:00
Tessa Thorntonandkodiakhq[bot] a49b0d6fa7 fix missing top border on comment box (#3102)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-13 20:53:37 +00:00
Tessa Thornton f47c8661da adjust line height for recent history (#3099) 2020-08-13 18:40:10 +02:00
Nick FunkandWyatt Johnson d67c3d2907 Mark and allow word list timed out comments (#3097)
Will mark the comment's metdata as a word list
time out if it happens and also tag them with
suspect or banned word.

Then we show "possible suspect/banned word"
markers on the moderate card so moderators can
manually review them.

CORL-1264

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-08-11 22:05:50 +00:00
Wyatt Johnson 3398bd12c4 fix: export public flag, fix button (#3098) 2020-08-11 21:49:32 +00:00
Wyatt Johnsonandkodiakhq[bot] fc6de50dde fix: move deps (#3095)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-11 20:28:20 +00:00
Nick Funk 6c32316595 6.3.2 mobile and responsive UI fixes (#3096)
* Remove vertical padding and line height on badges

Allows them to align with the time and user name
text elements.

* Hide report button text on mobile screens

* Allow read more links to wrap text on mobile

* Wrap comment tags when on mobile screens

* Fix collapse alignment on mobile screens

* Update top bar responsive scaling

* Use MatchMedia inside ReportButton

* Fix justification on comment TopBarRight
2020-08-11 20:13:11 +00:00
bowser2010andkodiakhq[bot] 47abd030ef Adding new translation (#3093)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-10 21:13:22 +00:00
Nick Funkandkodiakhq[bot] 5ffb53d0eb Add media to comment data downloads (#3089)
This will update the admin and user CSV
downloads to include a "Media" column that
will specify the media type and the URL
for the media content.

CORL-1188

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-10 20:59:30 +00:00
Nick Funkandkodiakhq[bot] af842e98ee Move wordlist check after staff approval check (#3094)
This allows staff members to comment anything
they want, even if it's on the banned word list.

CORL-1255

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-10 20:42:47 +00:00
Kim Gardnerandkodiakhq[bot] 281f19d21c Bump version 6.3.2 (#3092)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-10 20:27:44 +00:00
Nick Funkandkodiakhq[bot] 45cd0e6628 [CORL-1248] Allow users to auto-show media in stream (#3086)
* Create preliminary media preferences

Allows user to select whether they want to
automatically show media or not.

CORL-1248

* Fix up the copy around media preferences

CORL-1248

* Rename EmbedPreferences to UserMediaSettings

CORL-1248

* Add error/validation messages to media prefs

CORL-1248

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-10 20:12:56 +00:00
Tessa Thornton adc508c7dc remove duplicate code and add comment to wrapper component (#3076)
* remove duplicate code and add comment to wrapper component:

* use react hooks recommended settings
2020-08-10 12:30:25 -04:00
Nick Funk 88a77f8712 Show media in the moderate view conversation modal (#3088) 2020-08-10 09:29:17 -06:00
Tessa Thornton 5d2ab3d061 adjust spacing on configure tab on mobile (#3087) 2020-08-07 12:02:46 -04:00
Tessa Thorntonandkodiakhq[bot] df6f666447 make spacing between discussions and headers explicit (#3084)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-06 19:20:57 +00:00
Vinhandkodiakhq[bot] e412b27c1e fix: auto focus on reply (#3083)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-06 19:03:04 +00:00
Vinhandkodiakhq[bot] 0fe0be832e fix: use same focus styling (#3078)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-06 18:48:08 +00:00
Tessa Thorntonandkodiakhq[bot] 288809ee14 add PERMIT argunment to auth directives that should be accessible to suspended or banned users (#3085)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-06 17:49:49 +00:00
Wyatt Johnsonandkodiakhq[bot] b97ec638b2 fix: ensure anonymousId or userId is added to the payload (#3075)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-06 16:35:02 +00:00
Wyatt JohnsonandVinh 2bbfbc7ddd [CORL-1242] Ensure SSO Access Tokens are not persisted (#3080)
* fix: ensure access tokens from sso are not persisted

* fix: increment storage key field to bust existing usage

Co-authored-by: Vinh <vinh@vinh.tech>
2020-08-06 15:20:46 +00:00
b029a01bd9 setTimeout Fixes (#3082)
* fix: fixed types and some unmanaged timeouts

* fix: refetch type

Co-authored-by: Chi Vinh Le <vinh@vinh.tech>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-06 14:56:57 +00:00
Wyatt Johnsonandkodiakhq[bot] 6fabeb2755 [CORL-1243] Subscription Errors (#3074)
* fix: fixed subscription event error

* fix: further subscription refinements

* fix: review fixes

* fix: exhastive deps

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-06 14:42:04 +00:00
Vinhandkodiakhq[bot] 459e11a5fa fix: correctly cleanup timeout (#3081)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-05 23:32:14 +00:00
Nick Funkandkodiakhq[bot] ce7d6969dd Add read more opens new tab feature flag (#3079)
If the feature flag READ_MORE_NEW_TAB is
set, then clicking on "Read more of this
conversation" will open a new tab.

CORL-1246

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-05 21:10:55 +00:00
Vinhandkodiakhq[bot] 6a8d6b07d6 [CORL-1240] Check existing data before handling subscriptions (#3077)
* fix: check existing data before handling subscriptions

* fix: typo

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-05 20:56:11 +00:00
Wyatt JohnsonandVinh 8ede245a8d feat: added data-coral-count to count elements (#3055)
Co-authored-by: Vinh <vinh@vinh.tech>
2020-08-05 19:10:13 +00:00
Nick Funkandkodiakhq[bot] 88eb9555c7 [CORL-1227] Fix scroll-able modal position popping (#3069)
* Disable scrolling on site moderators modal

The site moderator modal already has a scroll bar
inside it and its height is less than 480px. We
don't need a scrollbar on the modal background since
the modal window will always be fully visible on
even the smallest screens.

This eliminates the bug of the modal sliding away
when there are enough sites in the org to cause the
background scroll to be activated.

CORL-1227

* Stop checkboxes from shoving input element down

The checkbox input element that we style away
using ::before css was being shoved down the
dom non-relative to the checkbox root.

Now it's relative to the checkbox root and positioned
accordingly.

CORL-1227

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-05 15:49:33 +00:00
ce53134736 [CORL-794] Create a common date formatter (#3073)
* Create a common date formatter

Updates all uses of Intl.DateTimeFormat(...)
with re-usable date time formatter functions.

The formatter functions have default formatting
options, but these can be overridden.

CORL-794

* Include options in useMemo

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>

* Make date formatting accept single locale string

Makes formatDate and createDateFormatter accept
string | string[] | undefined for the locales
argument.

CORL-794

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-05 15:34:42 +00:00
0f1dd7d707 add react hooks eslint plugin (#3059)
* add eslint react hooks

* fix code breaking the rules-of-hooks eslint rule

* fix spinnerWhileRendering for tests

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-05 14:42:50 +00:00
Wyatt Johnsonandkodiakhq[bot] 9d02391062 [CORL-1239] Swap setTimeout for setLongTimeout (#3071)
* fix: ensure user editable time use setLongTimeout

* fix: fixed wrong type

* fix: fixed snapshots

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-04 18:24:31 +00:00
Wyatt Johnsonandkodiakhq[bot] 8aac2d33fc [CORL-1238] Duplicate User Race (#3068)
* fix: added a single retry to user create

* feat: added additional error context

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-04 18:09:55 +00:00
Tessa Thorntonandkodiakhq[bot] 3eddf5f155 [CORL-1233] Mobile display fixes (#3067)
* mobile display fixes

* show button full text at larger breakpoint

* update snaps

* hardcode in media query for reaction buttons

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-08-04 17:55:30 +00:00
Nick Funk 94ff8ff880 fix: replace outdated keys with signingSecrets (#3070)
Looks like this was missed during the migration
of `auth.integrations.sso.keys` renamed to
`auth.integrations.sso.signingSecrets`.

CORL-1159
2020-08-04 11:09:24 -06:00
Nick FunkandWyatt Johnson 7dfc064c9f Better use flex to align callout contents (#3060)
CORL-1201

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-08-03 17:25:47 -06:00
Wyatt Johnson d602cf873c fix: support mobile twitter links (#3066) 2020-08-03 16:51:15 +00:00
Wyatt Johnson 79627af8d6 fix: fixed incorrect connection access (#3064) 2020-08-03 15:21:09 +00:00
871d3f80c1 [CORL-1230] corrects logic for editing comments with media attachments (#3063)
* correctly attach media to edited comments

* ensure media can be removed in edits

* fix: updates to support repeat post

Co-authored-by: Kim Gardner <kgardnr@gmail.com>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-07-31 18:03:54 +00:00
Wyatt Johnson f7d01174d7 fix: fixed overflow scrollbar appearing in dropdown (#3062) 2020-07-31 13:30:08 -04:00
Nick Funk 6966bb8d12 Replace positive/negative naming for success/error (#3058)
CORL-1200
2020-07-31 15:40:48 +00:00
Tessa Thornton 40ad2ed0cb remove hook causing crash from conversation modal replies (#3057) 2020-07-31 14:37:05 +00:00
802f656caa Stream UI bugfixes (#3041)
* fix: various ui fixes

* fix: tooltip button active color

* fix: teal color

* fix: RTE borders

* fix: snapshots

* fix: reduce padding of show more of this conversation button

* Fix font weight fallback values

* Replace RTE validation messages with v3 CallOuts

CORL-1213

* More styling classnames

* chore: remove not used style

* fix: reaction button primary color

* fix snapshots

* harmonize data-variant on buttons

* [CORL-1215] Install Style Tweaks (#3046)

* fix logic around repeat posts with or without media embeds: (#3042)

* fix: restore ReportCommentEvent (#3037)

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>

* fix: fixed issue with graphiql (#3043)

* README.md Update (#3045)

* chore: update README.md

* fix: removed README from doctoc

* fix: replaced emoji codes with emjoi

* fix: removed emoji's due to browser rendering issues

* fix: fixed bugs with install styles

Co-authored-by: Tessa Thornton <tessathornton@gmail.com>
Co-authored-by: Vinh <vinh@vinh.tech>

* fix: remove lineheight css variables and make them relative

* fix: adjust line-heights

* fix: update snapshots

* More css bindings for client styling

Set bindable class on community guidelines
Set bindable classname on "Comment on" label

* fix: more tweaks

* fix: snapshots

* fix: lint and tests

Co-authored-by: nick-funk <nick.funk@outlook.com>
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Co-authored-by: Tessa Thornton <tessathornton@gmail.com>
2020-07-31 00:19:59 +02:00
dfdea2b9d2 [CORL-1150] Discussions Tab (#3050)
* feat: Added Site.topStories edge

* feat: Added User.ongoingDiscussions edge

* connect discussions tab to relay

* style discussions tab

* add message if no ongoing discussions

* style site name in story row

* fix: make line-heights relative

* add custom class hooks

* feat: condition display based on feature flag

* add target attribute to story links

* fix: expose some featureFlags

* fix: fixed sorting

* fix: copy fixes

Co-authored-by: tessalt <tessathornton@gmail.com>
Co-authored-by: Chi Vinh Le <vinh@vinh.tech>
2020-07-30 17:18:59 -04:00
Wyatt Johnson 9a9c92d360 Site Moderator Fixes (#3054)
* fix: disable banning for site moderators

* fix: fixed redirect issue for site moderators
2020-07-30 16:04:28 +00:00
ceadcc7ae1 fix warning about media key in tests (#3048)
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
Co-authored-by: Kim Gardner <kgardnr@gmail.com>
2020-07-29 23:29:51 +00:00
Kim GardnerandWyatt Johnson e0db803a21 Bump version 6.3.1 (#3053)
* Bump version 6.3.1

* chore: bump version in package-lock.json

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-07-29 19:12:05 -04:00
Tessa ThorntonandWyatt Johnson 7a099bbf05 don't save clientMutationId when creating announcement (#3049)
* don't save clientMutationId when creating announcement

* move mutationId filtering from resolver to mutation

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-07-29 21:38:12 +00:00
Wyatt Johnson 51112a11c0 [CORL-1219] Media Type Fixes (#3051)
* fix: better graphql types

* fix: fixed tests

* fix: fixed tests
2020-07-29 21:11:53 +00:00
Wyatt Johnson 6e50b28d8b [CORL-1149] Active Stories (#3040)
* fix: removed type assertions in place of stricter types

* fix: fixed bug with module ordering

* feat: support for story activity jsonp route
2020-07-28 16:34:05 +00:00
Tessa Thornton 1f72cdbfb3 ensure preloaded css is actually used (#3047) 2020-07-28 08:42:39 -04:00
Wyatt Johnson 87aba459d6 README.md Update (#3045)
* chore: update README.md

* fix: removed README from doctoc

* fix: replaced emoji codes with emjoi

* fix: removed emoji's due to browser rendering issues
2020-07-24 19:06:33 +00:00
Wyatt Johnson 9aa4591655 fix: fixed issue with graphiql (#3043) 2020-07-24 17:19:08 +00:00
VinhandWyatt Johnson 87d32680f0 fix: restore ReportCommentEvent (#3037)
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-07-24 16:48:02 +00:00
Tessa Thornton 25a1dcdf8d fix logic around repeat posts with or without media embeds: (#3042) 2020-07-23 15:36:08 -06:00
Tessa ThorntonandWyatt Johnson e90272aa58 remove debug style from comment stream (#3038)
Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-07-22 23:32:27 +00:00
Tessa ThorntonandWyatt Johnson bbbff98270 pass custom stream css url through to html (#3039)
* pass custom stream css url through to html

* rename streamcssURL to customCSSURL

* only enable custom css query on stream route

* Update src/core/server/app/router/client.ts

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>

* simplify template for client html

Co-authored-by: Wyatt Johnson <wyattjoh@gmail.com>
2020-07-22 18:57:47 +00:00
Nick Funkandkodiakhq[bot] fe19ffd7e1 Show nice error message on network time out (#3036)
Shows "Network error. Please refresh your page
and try again." when the retry middleware times
out from too many attempts on failed/timed out
requests.

CORL-1199

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-07-22 00:02:27 +00:00
Nick Funk 7f98f13990 Send staff comments to Slack with all comments enabled (#3035)
When we set up a Slack channel, you can select to have
"All comments" sent to the slack channel. If we do this
we want staff comments to come through as well.

This wasn't happening before because there is a `staffCreated`
flag instead of `created` when a staff member comments.

So we change the trigger return type to an array, and when
a staff comment appears, return `staffCreated` as well as
`created` so the all filter lets it through.

I also changed `getBlocks(...)` to `getContent(...)` as it
now returns a JSON object with both a `blocks` array and a
`text` string field. This fixes the problem where Slack would
notifications would say "this content cannot be displayed".
Now it will say the text provided.

CORL-1172
2020-07-21 18:01:38 +00:00
Nick Funk 1a9bd27236 Implement TODO for rejected message when replying (#3034)
Implements the proper callout for when a user
submits a comment with a banned word when replying
to another comment.

CORL-1191
2020-07-20 16:44:49 +00:00
dependabot[bot] 536e804d61 chore(deps): bump lodash from 4.17.15 to 4.17.19 (#3033)
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-07-20 14:53:21 +00:00
Tessa Thorntonandkodiakhq[bot] 43d5d56c90 correct dashboard spacing (#3032)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-07-17 18:53:48 +00:00
Tessa Thorntonandkodiakhq[bot] cdcc991255 [CORL-1195] Fix bug with displaying site dashboards (#3031)
* fix bug where dashboard would not display data for sites beyond first page of results

* remove unused param

* remove unused file

* undo rename

* rename selectedSite to site

* check that sites.edges.length is greater than 0

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
2020-07-17 17:25:19 +00:00
Tessa Thornton b221baff82 [CORL-1194] correct typo in config (#3030)
* correct typo in config

* update snap
2020-07-17 15:14:52 +00:00
598 changed files with 9017 additions and 4835 deletions
-1
View File
@@ -27,4 +27,3 @@ yarn.lock
dist
*.css.d.ts
__generated__
README.md.orig
+2
View File
@@ -21,6 +21,7 @@ const typescriptOverrides = {
"@typescript-eslint/tslint",
"react",
"jsx-a11y",
"react-hooks",
],
settings: {
react: {
@@ -175,6 +176,7 @@ module.exports = {
"eslint:recommended",
"plugin:jsdoc/recommended",
"plugin:prettier/recommended",
"plugin:react-hooks/recommended",
],
parserOptions: {
ecmaVersion: 2018,
-1
View File
@@ -20,5 +20,4 @@ yarn.lock
dist
*.css.d.ts
__generated__
README.md.orig
persisted-queries.json
+12
View File
@@ -133,6 +133,7 @@ createComment.error
- <a href="#unfeatureComment">unfeatureComment</a>
- <a href="#updateNotificationSettings">updateNotificationSettings</a>
- <a href="#updateStorySettings">updateStorySettings</a>
- <a href="#updateUserMediaSettings">updateUserMediaSettings</a>
- <a href="#viewConversation">viewConversation</a>
- <a href="#viewFullDiscussion">viewFullDiscussion</a>
- <a href="#viewNewComments">viewNewComments</a>
@@ -587,6 +588,17 @@ createComment.error
};
}
```
- <a id="updateUserMediaSettings">**updateUserMediaSettings.success**, **updateUserMediaSettings.error**</a>:
```ts
{
unfurlEmbeds?: boolean | null | undefined;
success: {};
error: {
message: string;
code?: string | undefined;
};
}
```
- <a id="viewConversation">**viewConversation**</a>: This event is emitted when the viewer changes to the single conversation view.
```ts
{
+7 -30
View File
@@ -36,7 +36,6 @@ the old CSS Variables, please upgrade. Currently we have a compatibility layer t
- <a href="#font-weight-primary">font-weight-primary</a>
- <a href="#font-weight-secondary">font-weight-secondary</a>
- <a href="#font-size">font-size</a>
- <a href="#line-height">line-height</a>
- <a href="#shadow">shadow</a>
- <a href="#spacing">spacing</a>
- <a href="#mini-unit">mini-unit</a>
@@ -128,7 +127,7 @@ Color palette that is used for grey shades.
#### palette-error
Color palette that is used for indicating something negative and is usually red.
Color palette that is used for indicating something is error red.
`--palette-error-100: #FCE5D9; /* Before 6.3.0: --palette-error-lightest */`
@@ -150,7 +149,7 @@ Color palette that is used for indicating something negative and is usually red.
#### palette-success
Color palette that is used for indicating something positive and is usually green.
Color palette that is used for indicating something is success green.
`--palette-success-100: #D8F9D5; /* Before 6.3.0: --palette-success-lightest */`
@@ -192,17 +191,17 @@ Different font weights with matching values for the fonts.
#### font-weight-primary
`--font-weight-primary-bold: 700; /* Before 6.3.0: --font-weight-sans-bold */`
`--font-weight-primary-bold: 700; /* Before 6.3.0: --font-weight-bold */`
`--font-weight-primary-semi-bold: 600; /* Before 6.3.0: --font-weight-sans-medium */`
`--font-weight-primary-semi-bold: 600; /* Before 6.3.0: --font-weight-medium */`
`--font-weight-primary-regular: 300; /* Before 6.3.0: --font-weight-sans-regular */`
`--font-weight-primary-regular: 300; /* Before 6.3.0: --font-weight-light */`
#### font-weight-secondary
`--font-weight-secondary-bold: 700; /* Before 6.3.0: --font-weight-serif-bold */`
`--font-weight-secondary-bold: 700; /* Before 6.3.0: --font-weight-bold */`
`--font-weight-secondary-regular: 300; /* Before 6.3.0: --font-weight-serif-regular */`
`--font-weight-secondary-regular: 300; /* Before 6.3.0: --font-weight-light */`
### font-size
@@ -234,28 +233,6 @@ Different font weights with matching values for the fonts.
`--font-size-icon-xs: 0.75rem;`
### line-height
`--line-height-comment-body: 1.45rem;`
`--line-height-field-description: 1.3rem;`
`--line-height-1: 0.75rem;`
`--line-height-2: 0.875rem;`
`--line-height-3: 1rem;`
`--line-height-4: 1.125rem;`
`--line-height-5: 1.25rem;`
`--line-height-6: 1.5rem;`
`--line-height-7: 1.75rem;`
`--line-height-8: 2rem;`
### shadow
Different shadows that are currently used in Coral.
+37 -24
View File
@@ -1,39 +1,52 @@
# Coral ![CircleCI](https://img.shields.io/circleci/project/github/coralproject/talk.svg)
<p align="center">
<a href="https://coralproject.net" target="_blank"><img width="250" src="https://docs.coralproject.net/coral/images/coralproject_by_voxmedia.svg" alt="Coral by Vox Media" /></a>
</p>
Online comments are broken. Our open-source commenting platform, Coral, rethinks
how moderation, comment display, and conversation function, creating the
opportunity for safer, smarter discussions around your work.
[Read more about Coral here](https://coralproject.net/talk).
<p align="center">
A better commenting experience from <a href="https://product.voxmedia.com/" target="_blank">Vox Media</a>.
</p>
Built with <3 by the Coral team, a part of [Vox Media](https://product.voxmedia.com/).
<p align="center">
<a href="https://circleci.com/gh/coralproject/talk" target="_blank"><img src="https://img.shields.io/circleci/build/gh/coralproject/talk?style=flat-square" alt="CircleCI" /></a>
<a href="https://hub.docker.com/r/coralproject/talk" target="_blank"><img src="https://img.shields.io/docker/v/coralproject/talk?label=docker%20hub&sort=semver&style=flat-square" alt="Docker Image Version" /></a>
<a href="https://hub.docker.com/r/coralproject/talk" target="_blank"><img src="https://img.shields.io/docker/image-size/coralproject/talk?label=docker%20image%20size&sort=semver&style=flat-square" alt="Docker Image Size" /></a>
<a href="https://twitter.com/coralproject" target="_blank"><img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/coralproject?style=flat-square"></a>
</p>
Preview Coral easily by running it via a Heroku App:
## Description
[![Deploy](https://www.herokucdn.com/deploy/button.svg)](https://heroku.com/deploy?template=https://github.com/coralproject/talk)
Online comments are broken. Our open-source commenting platform,
[Coral](https://coralproject.net), rethinks how moderation, comment display, and
conversation function, creating the opportunity for safer, smarter discussions
around your work.
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
## Table of Contents
- [Documentation](#documentation)
- [Pre-Launch Guide](#pre-launch-guide)
- [More Resources](#more-resources)
- [License](#license)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
We offer hosting and support packages for Coral, as well as exclusive,
customer-only features. [Contact us](https://coralproject.net/pricing/) for more
information or [sign up for a webinar](https://coralproject.net).
## Documentation
You can get started with Coral using our [Documentation](https://docs.coralproject.net/talk/).
If you're new to Coral, the [Coral documentation](https://docs.coralproject.net/)
is a great place to start running and developing with Coral.
## Pre-Launch Guide
Youve installed Coral, and youre preparing to launch it on your site. The real
community work starts now, before you go live. You have a unique opportunity
pre-launch to set your community up for success. Read our
[Community Guides](https://guides.coralproject.net/start-here/) to learn more.
Youve installed Coral on your server, and youre preparing to launch it on your site. The real community work starts now, before you go live. You have a unique opportunity pre-launch to set your community up for success. Read our [Community Guides](https://guides.coralproject.net/start-here/) to learn more.
## Support
## More Resources
We can help you set up Coral, migrate your comments from another system,
integrate your registration platform, pair with your programmers, and help you
with bespoke installs. To learn more, [contact us](https://coralproject.net/pricing/).
- [Learn more about Coral and sign up for a webinar](https://coralproject.net/)
## Contributing
Coral is a Apache-2.0 licensed open-source project built with <3 by the Coral
team, a part of [Vox Media](https://product.voxmedia.com/).
If you are interested in contributing to Coral, check out our [Contributor's Guide](CONTRIBUTING.md).
## License
Coral is released under the [Apache License, v2.0](/LICENSE).
Coral is [Apache-2.0 licensed](LICENSE).
-38
View File
@@ -1,38 +0,0 @@
{
"name": "Coral",
"description": "A better commenting experience from Vox Media.",
"env": {
"REWRITE_ENV": {
"description": "Used to rewrite the environment variables set by Heroku.",
"value": "REDIS_URI:REDIS_URL,MONGODB_URI:MONGO_URI"
},
"SIGNING_SECRET": {
"description": "The shared secret to use to sign JSON Web Tokens (JWT) with the selected signing algorithm.",
"generator": "secret"
},
"LOCALE": {
"description": "Specify the default locale to use for all requests without a locale specified",
"value": "en-US"
},
"ENABLE_GRAPHIQL": {
"description": "When true, this will enable the GraphiQL routes",
"value": "false"
},
"TRUST_PROXY": {
"description": "When set to 1, it instructs Coral to trust up to one proxy, this is needed for authentication support",
"value": "1"
}
},
"addons": [
{
"plan": "mongolab:sandbox",
"as": "MONGO"
},
{
"plan": "rediscloud:30",
"as": "REDIS"
}
],
"success_url": "/install",
"website": "https://github.com/coralproject/talk"
}
+135 -90
View File
@@ -1,6 +1,6 @@
{
"name": "@coralproject/talk",
"version": "6.3.0",
"version": "6.3.2",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -8237,12 +8237,14 @@
"@types/d3-path": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-1.0.8.tgz",
"integrity": "sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA=="
"integrity": "sha512-AZGHWslq/oApTAHu9+yH/Bnk63y9oFOMROtqPAtxl5uB6qm1x2lueWdVEjsjjV3Qc2+QfuzKIwIR5MvVBakfzA==",
"dev": true
},
"@types/d3-shape": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-1.3.2.tgz",
"integrity": "sha512-LtD8EaNYCaBRzHzaAiIPrfcL3DdIysc81dkGlQvv7WQP3+YXV7b0JJTtR1U3bzeRieS603KF4wUo+ZkJVenh8w==",
"dev": true,
"requires": {
"@types/d3-path": "*"
}
@@ -8925,7 +8927,8 @@
"@types/prop-types": {
"version": "15.5.8",
"resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.5.8.tgz",
"integrity": "sha512-3AQoUxQcQtLHsK25wtTWIoIpgYjH3vSDroZOUr7PpCHw/jLY1RB9z9E8dBT/OSmwStVgkRNvdh+ZHNiomRieaw=="
"integrity": "sha512-3AQoUxQcQtLHsK25wtTWIoIpgYjH3vSDroZOUr7PpCHw/jLY1RB9z9E8dBT/OSmwStVgkRNvdh+ZHNiomRieaw==",
"dev": true
},
"@types/q": {
"version": "1.5.1",
@@ -8947,6 +8950,7 @@
"version": "16.9.31",
"resolved": "https://registry.npmjs.org/@types/react/-/react-16.9.31.tgz",
"integrity": "sha512-NpYJpNMWScFXtx3A2BJMeew2G3+9SEslVWMdxNJ6DLvxIuxWjY1bizK9q5Y1ujhln31vtjmhjOAYDr9Xx3k9FQ==",
"dev": true,
"requires": {
"@types/prop-types": "*",
"csstype": "^2.2.0"
@@ -9039,6 +9043,7 @@
"version": "1.8.11",
"resolved": "https://registry.npmjs.org/@types/recharts/-/recharts-1.8.11.tgz",
"integrity": "sha512-1E1+3uKo7EyNk3LZ6J2cqfayIdQEUt1YOq2Y/9eRSXUzasf100ncF4f0iARnaXnED6DyFgTPRomwtChcwLYvhA==",
"dev": true,
"requires": {
"@types/d3-shape": "*",
"@types/react": "*",
@@ -9048,7 +9053,8 @@
"@types/recharts-scale": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/recharts-scale/-/recharts-scale-1.0.0.tgz",
"integrity": "sha512-HR/PrCcxYb2YHviTqH7CMdL1TUhUZLTUKzfrkMhxm1HTa5mg/QtP8XMiuSPz6dZ6wecazAOu8aYZ5DqkNlgHHQ=="
"integrity": "sha512-HR/PrCcxYb2YHviTqH7CMdL1TUhUZLTUKzfrkMhxm1HTa5mg/QtP8XMiuSPz6dZ6wecazAOu8aYZ5DqkNlgHHQ==",
"dev": true
},
"@types/recompose": {
"version": "0.30.7",
@@ -14000,7 +14006,8 @@
"classnames": {
"version": "2.2.6",
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.2.6.tgz",
"integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q=="
"integrity": "sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==",
"dev": true
},
"clean-css": {
"version": "4.2.1",
@@ -16442,27 +16449,32 @@
"d3-array": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/d3-array/-/d3-array-1.2.4.tgz",
"integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw=="
"integrity": "sha512-KHW6M86R+FUPYGb3R5XiYjXPq7VzwxZ22buHhAEVG5ztoEcZZMLov530mmccaqA1GghZArjQV46fuc8kUqhhHw==",
"dev": true
},
"d3-collection": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/d3-collection/-/d3-collection-1.0.7.tgz",
"integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A=="
"integrity": "sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A==",
"dev": true
},
"d3-color": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/d3-color/-/d3-color-1.4.1.tgz",
"integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q=="
"integrity": "sha512-p2sTHSLCJI2QKunbGb7ocOh7DgTAn8IrLx21QRc/BSnodXM4sv6aLQlnfpvehFMLZEfBc6g9pH9SWQccFYfJ9Q==",
"dev": true
},
"d3-format": {
"version": "1.4.4",
"resolved": "https://registry.npmjs.org/d3-format/-/d3-format-1.4.4.tgz",
"integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw=="
"integrity": "sha512-TWks25e7t8/cqctxCmxpUuzZN11QxIA7YrMbram94zMQ0PXjE4LVIMe/f6a4+xxL8HQ3OsAFULOINQi1pE62Aw==",
"dev": true
},
"d3-interpolate": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-1.4.0.tgz",
"integrity": "sha512-V9znK0zc3jOPV4VD2zZn0sDhZU3WAE2bmlxdIwwQPPzPjvyLkd8B3JUVdS1IDUFDkWZ72c9qnv1GK2ZagTZ8EA==",
"dev": true,
"requires": {
"d3-color": "1"
}
@@ -16470,12 +16482,14 @@
"d3-path": {
"version": "1.0.9",
"resolved": "https://registry.npmjs.org/d3-path/-/d3-path-1.0.9.tgz",
"integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg=="
"integrity": "sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==",
"dev": true
},
"d3-scale": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-2.2.2.tgz",
"integrity": "sha512-LbeEvGgIb8UMcAa0EATLNX0lelKWGYDQiPdHj+gLblGVhGLyNbaCn3EvrJf0A3Y/uOOU5aD6MTh5ZFCdEwGiCw==",
"dev": true,
"requires": {
"d3-array": "^1.2.0",
"d3-collection": "1",
@@ -16489,6 +16503,7 @@
"version": "1.3.7",
"resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-1.3.7.tgz",
"integrity": "sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==",
"dev": true,
"requires": {
"d3-path": "1"
}
@@ -16496,12 +16511,14 @@
"d3-time": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/d3-time/-/d3-time-1.1.0.tgz",
"integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA=="
"integrity": "sha512-Xh0isrZ5rPYYdqhAVk8VLnMEidhz5aP7htAADH6MfzgmmicPkTo8LhkLxci61/lCB7n7UmE3bN0leRt+qvkLxA==",
"dev": true
},
"d3-time-format": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-2.2.3.tgz",
"integrity": "sha512-RAHNnD8+XvC4Zc4d2A56Uw0yJoM7bsvOlJR33bclxq399Rak/b9bhvu/InjxdWhPtkgU53JJcleJTGkNRnN6IA==",
"dev": true,
"requires": {
"d3-time": "1"
}
@@ -16815,7 +16832,8 @@
"decimal.js-light": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.0.tgz",
"integrity": "sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg=="
"integrity": "sha512-b3VJCbd2hwUpeRGG3Toob+CRo8W22xplipNhP3tN7TSVB/cyMX71P1vM2Xjc9H74uV6dS2hDDmo/rHq8L87Upg==",
"dev": true
},
"decode-uri-component": {
"version": "0.2.0",
@@ -18437,6 +18455,7 @@
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-3.4.0.tgz",
"integrity": "sha512-LnuPJ+dwqKDIyotW1VzmOZ5TONUN7CwkCR5hrgawTUbkBGYdeoNLZo6nNfGkCrjtE1nXXaj7iMMpDa8/d9WoIA==",
"dev": true,
"requires": {
"@babel/runtime": "^7.1.2"
}
@@ -20249,9 +20268,9 @@
}
},
"eslint-plugin-react-hooks": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
"integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==",
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.0.8.tgz",
"integrity": "sha512-6SSb5AiMCPd8FDJrzah+Z4F44P2CdOaK026cXFV+o/xSRzfOiV1FNFeLl2z6xm3yqWOQEZ5OfVgiec90qV2xrQ==",
"dev": true
},
"eslint-scope": {
@@ -22020,28 +22039,28 @@
"dependencies": {
"abbrev": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
"resolved": false,
"integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
"dev": true,
"optional": true
},
"ansi-regex": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
"resolved": false,
"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
"dev": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
"resolved": false,
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
"dev": true,
"optional": true
},
"are-we-there-yet": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
"resolved": false,
"integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
"dev": true,
"optional": true,
@@ -22052,14 +22071,14 @@
},
"balanced-match": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
"resolved": false,
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
"dev": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"resolved": false,
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
"dev": true,
"optional": true,
@@ -22077,35 +22096,35 @@
},
"code-point-at": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
"resolved": false,
"integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
"dev": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
"resolved": false,
"integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
"dev": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz",
"resolved": false,
"integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=",
"dev": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
"resolved": false,
"integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
"dev": true,
"optional": true
},
"debug": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
"resolved": false,
"integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
"dev": true,
"optional": true,
@@ -22115,21 +22134,21 @@
},
"deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"resolved": false,
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"dev": true,
"optional": true
},
"delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
"resolved": false,
"integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=",
"dev": true,
"optional": true
},
"detect-libc": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
"resolved": false,
"integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=",
"dev": true,
"optional": true
@@ -22159,7 +22178,7 @@
},
"gauge": {
"version": "2.7.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
"resolved": false,
"integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=",
"dev": true,
"optional": true,
@@ -22176,7 +22195,7 @@
},
"glob": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
"resolved": false,
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
"dev": true,
"optional": true,
@@ -22191,14 +22210,14 @@
},
"has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
"resolved": false,
"integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=",
"dev": true,
"optional": true
},
"iconv-lite": {
"version": "0.4.24",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
"resolved": false,
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"dev": true,
"optional": true,
@@ -22208,7 +22227,7 @@
},
"ignore-walk": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz",
"resolved": false,
"integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==",
"dev": true,
"optional": true,
@@ -22218,7 +22237,7 @@
},
"inflight": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"resolved": false,
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
"dev": true,
"optional": true,
@@ -22229,21 +22248,21 @@
},
"inherits": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"resolved": false,
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
"dev": true,
"optional": true
},
"ini": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
"resolved": false,
"integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
"dev": true,
"optional": true
},
"is-fullwidth-code-point": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
"resolved": false,
"integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
"dev": true,
"optional": true,
@@ -22253,14 +22272,14 @@
},
"isarray": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
"resolved": false,
"integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
"dev": true,
"optional": true
},
"minimatch": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
"resolved": false,
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
"dev": true,
"optional": true,
@@ -22308,7 +22327,7 @@
},
"ms": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
"resolved": false,
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
"dev": true,
"optional": true
@@ -22322,7 +22341,7 @@
},
"needle": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/needle/-/needle-2.3.0.tgz",
"resolved": false,
"integrity": "sha512-QBZu7aAFR0522EyaXZM0FZ9GLpq6lvQ3uq8gteiDUp7wKdy0lSd2hPlgFwVuW1CBkfEs9PfDQsQzZghLs/psdg==",
"dev": true,
"optional": true,
@@ -22334,7 +22353,7 @@
},
"node-pre-gyp": {
"version": "0.12.0",
"resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.12.0.tgz",
"resolved": false,
"integrity": "sha512-4KghwV8vH5k+g2ylT+sLTjy5wmUOb9vPhnM8NHvRf9dHmnW/CndrFXy2aRPaPST6dugXSdHXfeaHQm77PIz/1A==",
"dev": true,
"optional": true,
@@ -22353,7 +22372,7 @@
},
"nopt": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz",
"resolved": false,
"integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=",
"dev": true,
"optional": true,
@@ -22364,14 +22383,14 @@
},
"npm-bundled": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz",
"resolved": false,
"integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==",
"dev": true,
"optional": true
},
"npm-packlist": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz",
"resolved": false,
"integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==",
"dev": true,
"optional": true,
@@ -22382,7 +22401,7 @@
},
"npmlog": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
"resolved": false,
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
"dev": true,
"optional": true,
@@ -22395,21 +22414,21 @@
},
"number-is-nan": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
"resolved": false,
"integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
"dev": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"resolved": false,
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"dev": true,
"optional": true
},
"once": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"resolved": false,
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
"dev": true,
"optional": true,
@@ -22419,21 +22438,21 @@
},
"os-homedir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
"resolved": false,
"integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
"dev": true,
"optional": true
},
"os-tmpdir": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
"resolved": false,
"integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
"dev": true,
"optional": true
},
"osenv": {
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
"resolved": false,
"integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
"dev": true,
"optional": true,
@@ -22444,21 +22463,21 @@
},
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"resolved": false,
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
"dev": true,
"optional": true
},
"process-nextick-args": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
"resolved": false,
"integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
"dev": true,
"optional": true
},
"rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"resolved": false,
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"dev": true,
"optional": true,
@@ -22480,7 +22499,7 @@
},
"readable-stream": {
"version": "2.3.6",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
"resolved": false,
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
"dev": true,
"optional": true,
@@ -22496,7 +22515,7 @@
},
"rimraf": {
"version": "2.6.3",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
"resolved": false,
"integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
"dev": true,
"optional": true,
@@ -22506,49 +22525,49 @@
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"resolved": false,
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"resolved": false,
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"dev": true,
"optional": true
},
"sax": {
"version": "1.2.4",
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
"resolved": false,
"integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
"dev": true,
"optional": true
},
"semver": {
"version": "5.7.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
"resolved": false,
"integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
"dev": true,
"optional": true
},
"set-blocking": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
"resolved": false,
"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
"dev": true,
"optional": true
},
"signal-exit": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
"resolved": false,
"integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
"dev": true,
"optional": true
},
"string-width": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
"resolved": false,
"integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
"dev": true,
"optional": true,
@@ -22560,7 +22579,7 @@
},
"string_decoder": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
"resolved": false,
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
"dev": true,
"optional": true,
@@ -22570,7 +22589,7 @@
},
"strip-ansi": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
"resolved": false,
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
"dev": true,
"optional": true,
@@ -22580,7 +22599,7 @@
},
"strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"resolved": false,
"integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
"dev": true,
"optional": true
@@ -22603,14 +22622,14 @@
},
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"resolved": false,
"integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
"dev": true,
"optional": true
},
"wide-align": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
"resolved": false,
"integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
"dev": true,
"optional": true,
@@ -22620,7 +22639,7 @@
},
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"resolved": false,
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
"dev": true,
"optional": true
@@ -24051,6 +24070,12 @@
}
}
},
"eslint-plugin-react-hooks": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
"integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA==",
"dev": true
},
"event-source-polyfill": {
"version": "1.0.15",
"resolved": "https://registry.npmjs.org/event-source-polyfill/-/event-source-polyfill-1.0.15.tgz",
@@ -29508,12 +29533,9 @@
}
},
"graphql-playground-html": {
"version": "1.6.22",
"resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.22.tgz",
"integrity": "sha512-pqDJ8N8tI1LFORLZTDC+gByuqiBfbirjgMKprFxRbCmFylnIRj2AyUQUhTPQkm08n8pWj8w5T0wWCVtbE323ag==",
"requires": {
"xss": "^1.0.6"
}
"version": "1.6.13",
"resolved": "https://registry.npmjs.org/graphql-playground-html/-/graphql-playground-html-1.6.13.tgz",
"integrity": "sha512-5DNtVeaWrfxrobA2Vp3ypWjAQYGPIXyZ3rdQXy4m4nDJnc4UALPSZRh9y+U4kp8GaoPp1aCgIJerDSRBOT9HnA=="
},
"graphql-redis-subscriptions": {
"version": "2.2.1",
@@ -36110,7 +36132,8 @@
"js-tokens": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls="
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
"dev": true
},
"js-yaml": {
"version": "3.13.1",
@@ -37345,9 +37368,9 @@
}
},
"lodash": {
"version": "4.17.15",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
"integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A=="
"version": "4.17.19",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
"integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
},
"lodash-es": {
"version": "4.17.15",
@@ -37379,7 +37402,8 @@
"lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168="
"integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
"dev": true
},
"lodash.deburr": {
"version": "4.1.0",
@@ -37558,7 +37582,8 @@
"lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ="
"integrity": "sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=",
"dev": true
},
"lodash.toarray": {
"version": "4.4.0",
@@ -37785,6 +37810,7 @@
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
"integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
"dev": true,
"requires": {
"js-tokens": "^3.0.0"
}
@@ -38054,7 +38080,8 @@
"math-expression-evaluator": {
"version": "1.2.22",
"resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.22.tgz",
"integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ=="
"integrity": "sha512-L0j0tFVZBQQLeEjmWOvDLoRciIY8gQGWahvkztXUal8jH8R5Rlqo9GCvgqvXcy9LQhEWdQCVvzqAbxgYNt4blQ==",
"dev": true
},
"mathjs": {
"version": "2.7.0",
@@ -44873,6 +44900,7 @@
"version": "15.6.2",
"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.2.tgz",
"integrity": "sha512-3pboPvLiWD7dkI3qf3KbUe6hKFKa52w+AE0VCqECtf+QHAKgOL37tTaNCnuX1nAAQ4ZhyP+kYVKf8rLmJ/feDQ==",
"dev": true,
"requires": {
"loose-envify": "^1.3.1",
"object-assign": "^4.1.1"
@@ -45090,6 +45118,7 @@
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz",
"integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==",
"dev": true,
"requires": {
"performance-now": "^2.1.0"
}
@@ -45916,7 +45945,8 @@
"react-fast-compare": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz",
"integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw=="
"integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==",
"dev": true
},
"react-feather": {
"version": "2.0.3",
@@ -45978,6 +46008,7 @@
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/react-helmet/-/react-helmet-5.2.1.tgz",
"integrity": "sha512-CnwD822LU8NDBnjCpZ4ySh8L6HYyngViTZLfBBb3NjtrpN8m49clH8hidHouq20I51Y6TpCTISCBbqiY5GamwA==",
"dev": true,
"requires": {
"object-assign": "^4.1.1",
"prop-types": "^15.5.4",
@@ -46029,7 +46060,8 @@
"react-lifecycles-compat": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==",
"dev": true
},
"react-live": {
"version": "2.2.2",
@@ -46256,6 +46288,7 @@
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/react-side-effect/-/react-side-effect-1.2.0.tgz",
"integrity": "sha512-v1ht1aHg5k/thv56DRcjw+WtojuuDHFUgGfc+bFHOWsF4ZK6C2V57DO0Or0GPsg6+LSTE0M6Ry/gfzhzSwbc5w==",
"dev": true,
"requires": {
"shallowequal": "^1.0.1"
}
@@ -46270,6 +46303,7 @@
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-1.0.5.tgz",
"integrity": "sha512-eW057HT0lFgCKh8ilr0y2JaH2YbNcuEdFpxyg7Gf/qDKk9hqGMyXryZJ8iMGJEuKH0+wxS0ccSsBBB3W8yCn8w==",
"dev": true,
"requires": {
"lodash": "~4.17.4",
"prop-types": "^15.6.0",
@@ -46281,6 +46315,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
"integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
"dev": true,
"requires": {
"js-tokens": "^3.0.0 || ^4.0.0"
}
@@ -46289,6 +46324,7 @@
"version": "2.9.0",
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-2.9.0.tgz",
"integrity": "sha512-+HzNTCHpeQyl4MJ/bdE0u6XRMe9+XG/+aL4mCxVN4DnPBQ0/5bfHWPDuOZUzYdMj94daZaZdCCc1Dzt9R/xSSg==",
"dev": true,
"requires": {
"dom-helpers": "^3.4.0",
"loose-envify": "^1.4.0",
@@ -46465,6 +46501,7 @@
"version": "1.8.5",
"resolved": "https://registry.npmjs.org/recharts/-/recharts-1.8.5.tgz",
"integrity": "sha512-tM9mprJbXVEBxjM7zHsIy6Cc41oO/pVYqyAsOHLxlJrbNBuLs0PHB3iys2M+RqCF0//k8nJtZF6X6swSkWY3tg==",
"dev": true,
"requires": {
"classnames": "^2.2.5",
"core-js": "^2.6.10",
@@ -46482,12 +46519,14 @@
"core-js": {
"version": "2.6.11",
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg=="
"integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
"dev": true
},
"react-resize-detector": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/react-resize-detector/-/react-resize-detector-2.3.0.tgz",
"integrity": "sha512-oCAddEWWeFWYH5FAcHdBYcZjAw9fMzRUK9sWSx6WvSSOPVRxcHd5zTIGy/mOus+AhN/u6T4TMiWxvq79PywnJQ==",
"dev": true,
"requires": {
"lodash.debounce": "^4.0.8",
"lodash.throttle": "^4.1.1",
@@ -46501,6 +46540,7 @@
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.3.tgz",
"integrity": "sha512-t8p5sccG9Blm7c1JQK/ak9O8o95WGhNXD7TXg/BW5bYbVlr6eCeRBNpgyigD4p6pSSMehC5nSvBUPj6F68rbFA==",
"dev": true,
"requires": {
"decimal.js-light": "^2.4.1"
}
@@ -46559,6 +46599,7 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz",
"integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=",
"dev": true,
"requires": {
"balanced-match": "^0.4.2",
"math-expression-evaluator": "^1.2.14",
@@ -46568,7 +46609,8 @@
"balanced-match": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz",
"integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg="
"integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=",
"dev": true
}
}
},
@@ -46576,6 +46618,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.3.tgz",
"integrity": "sha512-Hl/tuV2VDgWgCSEeWMLwxLZqX7OK59eU1guxXsRKTAyeYimivsKdtcV4fu3r710tpG5GmDKDhQ0HSZLExnNmyQ==",
"dev": true,
"requires": {
"balanced-match": "^1.0.0"
}
@@ -47868,7 +47911,8 @@
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="
"integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==",
"dev": true
},
"resolve": {
"version": "1.8.1",
@@ -48380,7 +48424,8 @@
"shallowequal": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz",
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ=="
"integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==",
"dev": true
},
"shebang-command": {
"version": "1.2.0",
+14 -9
View File
@@ -1,6 +1,6 @@
{
"name": "@coralproject/talk",
"version": "6.3.0",
"version": "6.3.2",
"author": "The Coral Project",
"homepage": "https://coralproject.net/",
"sideEffects": [
@@ -29,7 +29,7 @@
"migration:create": "ts-node --transpile-only ./scripts/migration/create.ts",
"docs:events": "ts-node ./scripts/generateEventDocs.ts ./src/core/client/stream/events.ts ./CLIENT_EVENTS.md",
"docs:css-variables": "ts-node ./scripts/generateCSSVariablesDocs.ts ./src/core/client/ui/theme/streamVariables.ts ./CSS_VARIABLES.md",
"doctoc": "doctoc --maxlevel=3 --title '## Table of Contents' README.md CLIENT_EVENTS.md CONTRIBUTING.md WEBHOOKS.md EXTERNAL_MODERATION_PHASES.md",
"doctoc": "doctoc --maxlevel=3 --title '## Table of Contents' CLIENT_EVENTS.md CONTRIBUTING.md WEBHOOKS.md EXTERNAL_MODERATION_PHASES.md",
"generate": "npm-run-all generate:css-types generate:schema generate:relay",
"generate-persist": "npm-run-all generate:css-types generate:schema generate:relay-persist",
"generate:css-types": "tcm src/core/client/",
@@ -67,7 +67,6 @@
"@hapi/joi": "^17.1.1",
"@metascraper/helpers": "^5.11.6",
"@rudderstack/rudder-sdk-node": "0.0.2",
"@types/recharts": "^1.8.9",
"abort-controller": "^3.0.0",
"akismet-api": "^5.0.0",
"apollo-server-core": "^2.14.4",
@@ -100,8 +99,7 @@
"graphql-config": "^2.2.2",
"graphql-extensions": "^0.11.0",
"graphql-fields": "2.0.3",
"graphql-import": "^0.7.1",
"graphql-playground-html": "^1.6.22",
"graphql-playground-html": "1.6.13",
"graphql-redis-subscriptions": "^2.2.1",
"graphql-subscriptions": "^1.1.0",
"graphql-tools": "^4.0.7",
@@ -114,7 +112,7 @@
"juice": "^6.0.0",
"jwks-rsa": "^1.7.0",
"linkifyjs": "^2.1.9",
"lodash": "^4.17.15",
"lodash": "^4.17.19",
"long-settimeout": "^1.0.1",
"lru-cache": "^5.1.1",
"luxon": "^1.22.2",
@@ -138,8 +136,6 @@
"prom-client": "^12.0.0",
"proxy-agent": "^3.1.1",
"querystringify": "^2.1.1",
"react-helmet": "^5.2.1",
"recharts": "^1.8.5",
"source-map-support": "^0.5.16",
"stack-utils": "^2.0.1",
"striptags": "^3.1.1",
@@ -225,6 +221,7 @@
"@types/react-responsive": "^8.0.2",
"@types/react-test-renderer": "^16.9.2",
"@types/react-transition-group": "^4.2.4",
"@types/recharts": "^1.8.9",
"@types/recompose": "^0.30.7",
"@types/relay-runtime": "^8.0.7",
"@types/sane": "^2.0.0",
@@ -279,6 +276,7 @@
"eslint-plugin-jsx-a11y": "^6.3.1",
"eslint-plugin-prettier": "^3.1.4",
"eslint-plugin-react": "^7.20.0",
"eslint-plugin-react-hooks": "^4.0.8",
"eventemitter2": "^6.3.1",
"farce": "^0.2.8",
"final-form": "4.18.6",
@@ -334,6 +332,7 @@
"react-error-overlay": "^6.0.7",
"react-final-form": "6.3.0",
"react-final-form-arrays": "^3.1.1",
"react-helmet": "^5.2.1",
"react-popper": "^1.3.7",
"react-relay": "^9.0.0",
"react-relay-network-modern": "^4.6.1",
@@ -341,6 +340,7 @@
"react-test-renderer": "^16.13.1",
"react-timeago": "^4.4.0",
"react-transition-group": "^4.3.0",
"recharts": "^1.8.5",
"recompose": "^0.30.0",
"regenerator-runtime": "^0.13.5",
"relay-compiler": "^9.0.0",
@@ -409,6 +409,11 @@
"Newer versions has problems with radio and checkbox fields.",
"Update when the following issue is resolved:",
"https://github.com/final-form/react-final-form/issues/683"
],
"graphql-playground-html@1.6.13": [
"A template was broken in a release.",
"Update when the following issue is resolved:",
"https://github.com/prisma-labs/graphql-playground/pull/1238"
]
},
"husky": {
@@ -429,7 +434,7 @@
"{src/core/client/ui/theme/sharedVariables.ts,src/core/client/ui/theme/streamVariables.ts,scripts/generateCSSVariablesDocs.ts,CSS_VARIABLES.md}": [
"npm run docs:css-variables -- --verify"
],
"{README,CLIENT_EVENTS,CONTRIBUTING,WEBHOOKS,EXTERNAL_MODERATION_PHASES}.md": [
"{CLIENT_EVENTS,CONTRIBUTING,WEBHOOKS,EXTERNAL_MODERATION_PHASES}.md": [
"npm run doctoc"
]
},
+1
View File
@@ -19,6 +19,7 @@ async function main() {
const ManagedCoralContextProvider = await createManaged({
initLocalState,
localesData,
bundle: "account",
});
const Index: FunctionComponent = () => (
+1 -1
View File
@@ -3,7 +3,7 @@
font-style: normal;
font-weight: var(--font-weight-secondary-bold);
font-size: var(--font-size-6);
line-height: var(--line-height-7);
line-height: 1.17;
color: var(--palette-text-500);
@@ -3,7 +3,7 @@
font-style: normal;
font-weight: var(--font-weight-secondary-bold);
font-size: var(--font-size-6);
line-height: var(--line-height-7);
line-height: 1.17;
color: var(--palette-text-500);
@@ -23,7 +23,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-3);
line-height: var(--line-height-5);
line-height: 1.25;
color: var(--palette-text-500);
@@ -7,7 +7,7 @@ import { CallOut } from "coral-ui/components/v3";
const Sorry: FunctionComponent = () => {
return (
<CallOut
color="negative"
color="error"
icon={<Icon>error</Icon>}
titleWeight="semiBold"
title={
@@ -3,7 +3,7 @@
font-style: normal;
font-weight: var(--font-weight-secondary-bold);
font-size: var(--font-size-6);
line-height: var(--line-height-7);
line-height: 1.17;
color: var(--palette-text-500);
@@ -15,7 +15,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-3);
line-height: var(--line-height-5);
line-height: 1.25;
color: var(--palette-text-500);
@@ -27,7 +27,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-bold);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
color: var(--palette-text-500);
@@ -39,7 +39,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-4);
line-height: 1.285;
color: var(--palette-text-100);
@@ -16,7 +16,7 @@ const Sorry: React.FunctionComponent<Props> = ({ reason }) => {
<div className={styles.title}>Oops Sorry!</div>
</Localized>
<CallOut
color="negative"
color="error"
titleWeight="semiBold"
title={
reason ? (
@@ -16,7 +16,7 @@ const Sorry: React.FunctionComponent<Props> = ({ reason }) => {
<div className={styles.title}>Oops Sorry!</div>
</Localized>
<CallOut
color="negative"
color="error"
titleWeight="semiBold"
title={
reason ? (
@@ -3,7 +3,7 @@
font-style: normal;
font-weight: var(--font-weight-secondary-bold);
font-size: var(--font-size-6);
line-height: var(--line-height-7);
line-height: 1.17;
color: var(--palette-text-500);
@@ -15,7 +15,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-3);
line-height: var(--line-height-5);
line-height: 1.25;
color: var(--palette-text-500);
@@ -27,7 +27,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-bold);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
color: var(--palette-text-500);
@@ -39,7 +39,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-4);
line-height: 1.285;
color: var(--palette-text-100);
@@ -51,7 +51,7 @@ const UnsubscribeForm: React.FunctionComponent<Props> = ({
notifications.
</div>
</Localized>
{submitError && <CallOut color="negative" title={submitError} />}
{submitError && <CallOut color="error" title={submitError} />}
<Localized id="unsubscribe-submit-unsubscribe">
<Button
type="submit"
@@ -3,7 +3,7 @@
font-style: normal;
font-weight: var(--font-weight-secondary-bold);
font-size: var(--font-size-6);
line-height: var(--line-height-7);
line-height: 1.17;
color: var(--palette-text-500);
@@ -15,7 +15,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-3);
line-height: var(--line-height-5);
line-height: 1.25;
color: var(--palette-text-500);
@@ -27,7 +27,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-bold);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
color: var(--palette-text-500);
@@ -39,7 +39,7 @@
font-style: normal;
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-4);
line-height: 1.285;
color: var(--palette-text-100);
@@ -105,9 +105,7 @@ const ResetPasswordForm: React.FunctionComponent<Props> = ({
</FormField>
)}
</Field>
{submitError && (
<CallOut color="negative" title={submitError} />
)}
{submitError && <CallOut color="error" title={submitError} />}
<Localized id="resetPassword-resetPassword">
<Button
type="submit"
@@ -16,7 +16,7 @@ const Sorry: React.FunctionComponent<Props> = ({ reason }) => {
<div className={styles.title}>Oops Sorry!</div>
</Localized>
<CallOut
color="negative"
color="error"
titleWeight="semiBold"
title={
reason ? (
@@ -36,6 +36,7 @@ exports[`renders form 1`] = `
<div>
<button
className="BaseButton-root Button-base Button-filled Button-fontSizeSmall Button-textAlignCenter Button-fontFamilyPrimary Button-fontWeightPrimaryBold Button-paddingSizeSmall Button-colorPrimary Button-upperCase Button-fullWidth Confirm-submit"
data-variant="filled"
disabled={false}
onBlur={[Function]}
onFocus={[Function]}
@@ -78,10 +79,10 @@ exports[`renders missing confirm token 1`] = `
Oops Sorry!
</div>
<div
className="CallOut-root CallOut-negative CallOut-leftBorder"
className="CallOut-root CallOut-error CallOut-leftBorder"
>
<div
className="Box-root Flex-root Flex-flex Flex-justifyFlexStart Flex-alignFlexStart"
className="CallOut-container"
>
<div
className="CallOut-content"
@@ -93,6 +93,7 @@ Make sure it is unique and be sure to keep it secure.
</div>
<button
className="BaseButton-root Button-base Button-filled Button-fontSizeSmall Button-textAlignCenter Button-fontFamilyPrimary Button-fontWeightPrimaryBold Button-paddingSizeMedium Button-colorPrimary Button-upperCase Button-fullWidth Reset-submit"
data-variant="filled"
disabled={false}
onBlur={[Function]}
onFocus={[Function]}
@@ -136,10 +137,10 @@ exports[`renders missing reset token 1`] = `
Oops Sorry!
</div>
<div
className="CallOut-root CallOut-negative CallOut-leftBorder"
className="CallOut-root CallOut-error CallOut-leftBorder"
>
<div
className="Box-root Flex-root Flex-flex Flex-justifyFlexStart Flex-alignFlexStart"
className="CallOut-container"
>
<div
className="CallOut-content"
@@ -35,6 +35,7 @@ exports[`renders form 1`] = `
</div>
<button
className="BaseButton-root Button-base Button-filled Button-fontSizeSmall Button-textAlignCenter Button-fontFamilyPrimary Button-fontWeightPrimaryBold Button-paddingSizeMedium Button-colorPrimary Button-upperCase Button-fullWidth Unsubscribe-submit"
data-variant="filled"
disabled={false}
onBlur={[Function]}
onFocus={[Function]}
@@ -77,10 +78,10 @@ exports[`renders missing confirm token 1`] = `
Oops Sorry!
</div>
<div
className="CallOut-root CallOut-negative CallOut-leftBorder"
className="CallOut-root CallOut-error CallOut-leftBorder"
>
<div
className="Box-root Flex-root Flex-flex Flex-justifyFlexStart Flex-alignFlexStart"
className="CallOut-container"
>
<div
className="CallOut-content"
@@ -1,7 +1,7 @@
.root {
height: 100%;
font-size: var(--font-size-1);
line-height: var(--line-height-3);
line-height: 1.33;
color: var(--palette-text-100);
padding: 0 var(--spacing-1);
}
@@ -6,5 +6,5 @@
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-4);
line-height: 1.285;
}
@@ -1,10 +1,10 @@
$moderateCardDecisionHistoryLinkTextColor: $colors-teal-700;
.root {
line-height: var(--line-height-3);
font-weight: var(--font-weight-primary-bold);
font-family: var(--font-family-primary);
font-size: var(--font-size-1);
line-height: 1.33;
color: $moderateCardDecisionHistoryLinkTextColor;
font-style: var(--font-style-underline);
}
@@ -11,6 +11,6 @@
color: var(--palette-text-500);
font-weight: var(--font-weight-primary-semi-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-4);
font-size: var(--font-size-2);
line-height: 1.285;
}
@@ -5,7 +5,7 @@ $moderateCardDecisionHistoryBorderColor: var(--palette-grey-300);
font-size: var(--font-size-2);
font-weight: var(--font-weight-primary-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-3);
line-height: 1.14;
text-transform: uppercase;
color: $moderateCardDecisionHistoryLinkTextColor;
width: 100%;
@@ -5,5 +5,5 @@ $timestampColor: var(--palette-text-100);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-bold);
font-size: var(--font-size-1);
line-height: var(--line-height-3);
line-height: 1.33;
}
@@ -4,6 +4,6 @@ $moderateCardDecisionHistoryColor: var(--palette-text-900);
color: $moderateCardDecisionHistoryColor;
font-weight: var(--font-weight-secondary-bold);
font-family: var(--font-family-secondary);
line-height: var(--line-height-field-description);
line-height: 1.3;
font-size: var(--font-size-3);
}
@@ -11,9 +11,7 @@ exports[`renders correctly 1`] = `
className="DecisionHistoryLoading-container"
justifyContent="center"
>
<Delay
ms={500}
>
<Delay>
<withPropsOnChange(Spinner)
size="sm"
/>
@@ -1,4 +1,5 @@
import { useRouter } from "found";
import { setLongTimeout } from "long-settimeout";
import { ReactNode, useContext } from "react";
import { NotificationContext } from "./GlobalNotificationContext";
@@ -17,7 +18,7 @@ function useNotification() {
const setMessage = (message: ReactNode, timeout?: number) => {
dispatch({ type: "SET_MESSAGE", message });
if (timeout) {
setTimeout(() => {
setLongTimeout(() => {
dispatch({ type: "CLEAR_MESSAGE" });
}, timeout);
}
@@ -8,7 +8,7 @@ $comment-link-active: $colors-teal-900;
font-size: var(--font-size-3);
font-weight: var(--font-weight-primary-regular);
font-family: var(--font-family-primary);
line-height: var(--line-height-comment-body);
line-height: 1.45;
color: $comment-content;
overflow-wrap: break-word;
@@ -11,14 +11,14 @@ $moderateCardUsernameBackgroundHover: var(--palette-grey-200);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
}
.username {
color: $moderateCardInReplyToUsernameColor;
font-family: var(--font-family-secondary);
font-weight: var(--font-weight-secondary-bold);
font-size: var(--font-size-3);
line-height: var(--line-height-3);
line-height: 1;
padding: var(--spacing-1);
@@ -4,6 +4,6 @@ $moderateCardUsernameColor: var(--palette-text-900);
font-size: var(--font-size-3);
font-weight: var(--font-weight-secondary-bold);
font-family: var(--font-family-secondary);
line-height: var(--line-height-3);
line-height: 1;
color: $moderateCardUsernameColor;
}
@@ -5,7 +5,7 @@ $moderateCardUsernameBackgroundHover: var(--palette-grey-200);
padding: var(--spacing-1);
margin-left: calc(-1 * var(--spacing-1));
line-height: var(--line-height-3);
line-height: 1;
&:hover {
background-color: $moderateCardUsernameBackgroundHover;
@@ -3,6 +3,7 @@ import cn from "classnames";
import React, { FunctionComponent, useCallback, useState } from "react";
import { graphql } from "react-relay";
import { MediaContainer } from "coral-admin/components/MediaContainer";
import { withFragmentContainer } from "coral-framework/lib/relay";
import {
Button,
@@ -95,6 +96,7 @@ const ConversationModalCommentContainer: FunctionComponent<Props> = ({
{comment.body}
</CommentContent>
)}
<MediaContainer comment={comment} />
</div>
</HorizontalGutter>
</Flex>
@@ -104,7 +106,7 @@ const ConversationModalCommentContainer: FunctionComponent<Props> = ({
<Localized id="conversation-modal-reply-show-replies">
<Button
color="mono"
variant="outline"
variant="outlined"
onClick={onShowReplies}
fullWidth
>
@@ -153,6 +155,7 @@ const enhanced = withFragmentContainer<Props>({
id
}
}
...MediaContainer_comment
}
`,
})(ConversationModalCommentContainer);
@@ -4,7 +4,7 @@ $modal-header-text: var(--palette-text-900);
font-size: var(--font-size-4);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
line-height: var(--line-height-5);
line-height: 1.11;
color: $modal-header-text;
margin: 0;
}
@@ -39,7 +39,12 @@ const ConversationModalHeaderContainer: FunctionComponent<Props> = ({
: comment.story.url}
</h1>
<Localized id="conversation-modal-header-moderate-link">
<Button variant="outline" color="mono" uppercase onClick={onModerate}>
<Button
variant="outlined"
color="mono"
uppercase
onClick={onModerate}
>
Moderate story
</Button>
</Localized>
@@ -62,7 +62,7 @@ const ConversationModalRepliesContainer: FunctionComponent<Props> = ({
<div className={styles.footer}>
{!showReplies && comment.replyCount > 0 && (
<Localized id="conversation-modal-replies-show">
<Button variant="outline" fullWidth onClick={onShowReplies}>
<Button variant="outlined" fullWidth onClick={onShowReplies}>
Show replies
</Button>
</Localized>
@@ -71,7 +71,7 @@ const ConversationModalRepliesContainer: FunctionComponent<Props> = ({
comment.replyCount > replies.length &&
replies.length > 0 && (
<Localized id="conversation-modal-replies-show-more">
<Button variant="outline" fullWidth onClick={loadMore}>
<Button variant="outlined" fullWidth onClick={loadMore}>
Show more replies
</Button>
</Localized>
@@ -1,5 +1,5 @@
import { Localized } from "@fluent/react/compat";
import React, { FunctionComponent, useMemo } from "react";
import React, { FunctionComponent } from "react";
import { graphql } from "react-relay";
import { QueryRenderData, QueryRenderer } from "coral-framework/lib/relay";
@@ -60,17 +60,13 @@ const ConversationModalRepliesQuery: FunctionComponent<Props> = ({
);
}
const replies = useMemo(
() => props.comment!.replies.edges.map((edge) => edge.node),
[props.comment.replies]
);
return (
<div>
{replies.map((reply) => (
<div key={reply.id}>
{props.comment.replies.edges.map((reply) => (
<div key={reply.node.id}>
<ConversationModalCommentContainer
key={reply.id}
comment={reply}
key={reply.node.id}
comment={reply.node}
settings={props.settings}
isHighlighted={false}
isReply={true}
@@ -0,0 +1,4 @@
export { default as MediaContainer } from "./MediaContainer";
export { default as GiphyMedia } from "./GiphyMedia";
export { default as TwitterMedia } from "./TwitterMedia";
export { default as YouTubeMedia } from "./YouTubeMedia";
@@ -4,6 +4,6 @@ $modal-body-text: $colors-mono-500;
font-size: var(--font-size-3);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
line-height: var(--line-height-field-description);
line-height: 1.3;
color: $modal-body-text;
}
@@ -4,7 +4,7 @@ $modal-text: $colors-mono-500;
font-size: var(--font-size-5);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-title);
line-height: 1.2;
color: $modal-text;
margin: 0;
}
@@ -4,6 +4,6 @@ $moderateCardFlagsCategoryColor: var(--palette-text-500);
font-size: var(--font-size-3);
font-weight: var(--font-weight-primary-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-6);
line-height: 1.5;
color: $moderateCardFlagsCategoryColor;
}
@@ -6,7 +6,7 @@ $moderateCardReasonTextColor: var(--palette-text-500);
font-size: var(--font-size-2);
font-weight: var(--font-weight-secondary-bold);
font-family: var(--font-family-secondary);
line-height: var(--line-height-3);
line-height: 1.14;
padding-right: calc(0.5 * var(--mini-unit));
}
@@ -17,11 +17,10 @@ $moderateCardReasonTextColor: var(--palette-text-500);
font-size: var(--font-size-2);
font-weight: var(--font-weight-primary-regular);
font-family: var(--font-family-primary);
line-height: var(--line-height-3);
line-height: 1.14;
}
.flagger {
line-height: var(--line-height-3);
margin-right: var(--mini-unit);
padding: var(--spacing-1);
margin-left: calc(-1 * var(--spacing-1));
@@ -32,6 +32,11 @@ it("renders all markers", () => {
},
},
},
metadata: {
wordList: {
timedOut: false,
},
},
},
},
settings: {
@@ -71,6 +76,11 @@ it("renders some markers", () => {
},
},
},
metadata: {
wordList: {
timedOut: false,
},
},
},
},
settings: {
@@ -38,7 +38,17 @@ const markers: Array<(
null,
(c) =>
(c.revision &&
c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_BANNED_WORD && (
c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_BANNED_WORD &&
c.revision.metadata?.wordList?.timedOut && (
<Localized id="moderate-marker-possibleBannedWord" key={keyCounter++}>
<Marker color="reported">Possible Banned Word</Marker>
</Localized>
)) ||
null,
(c) =>
(c.revision &&
c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_BANNED_WORD &&
!c.revision.metadata?.wordList?.timedOut && (
<Localized id="moderate-marker-bannedWord" key={keyCounter++}>
<Marker color="reported">Banned Word</Marker>
</Localized>
@@ -46,7 +56,17 @@ const markers: Array<(
null,
(c) =>
(c.revision &&
c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_SUSPECT_WORD && (
c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_SUSPECT_WORD &&
c.revision.metadata?.wordList?.timedOut && (
<Localized id="moderate-marker-possibleSuspectWord" key={keyCounter++}>
<Marker color="reported">Possible Suspect Word</Marker>
</Localized>
)) ||
null,
(c) =>
(c.revision &&
c.revision.actionCounts.flag.reasons.COMMENT_DETECTED_SUSPECT_WORD &&
!c.revision.metadata?.wordList?.timedOut && (
<Localized id="moderate-marker-suspectWord" key={keyCounter++}>
<Marker color="reported">Suspect Word</Marker>
</Localized>
@@ -193,6 +213,11 @@ const enhanced = withFragmentContainer<MarkersContainerProps>({
}
}
}
metadata {
wordList {
timedOut
}
}
}
}
`,
@@ -101,7 +101,7 @@ $moderateCardLinkTextColor: $colors-teal-700;
font-size: var(--font-size-1);
font-weight: var(--font-weight-primary-semi-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-3);
line-height: 1.33;
color: $moderateCardLinkTextColor;
text-transform: uppercase;
}
@@ -115,7 +115,7 @@ $moderateCardLinkTextColor: $colors-teal-700;
font-size: var(--font-size-1);
font-weight: var(--font-weight-primary-semi-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-3);
line-height: 1.33;
margin-bottom: var(--spacing-1);
text-transform: uppercase;
}
@@ -123,7 +123,7 @@ $moderateCardLinkTextColor: $colors-teal-700;
.commentOn {
font-size: var(--font-size-2);
font-family: var(--font-family-primary);
line-height: var(--line-height-3);
line-height: 1.14;
margin-bottom: var(--spacing-1);
}
@@ -152,7 +152,7 @@ $moderateCardLinkTextColor: $colors-teal-700;
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-1);
line-height: var(--line-height-3);
line-height: 1.33;
}
.edited {
@@ -160,7 +160,7 @@ $moderateCardLinkTextColor: $colors-teal-700;
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-1);
line-height: var(--line-height-3);
line-height: 1.33;
padding-left: var(--spacing-2);
}
@@ -174,7 +174,7 @@ $moderateCardLinkTextColor: $colors-teal-700;
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-1);
line-height: var(--line-height-3);
line-height: 1.33;
padding-left: var(--spacing-2);
}
@@ -183,5 +183,5 @@ $moderateCardLinkTextColor: $colors-teal-700;
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-4);
line-height: 1.285;
}
@@ -10,6 +10,7 @@ import React, {
useRef,
} from "react";
import { MediaContainer } from "coral-admin/components/MediaContainer";
import { HOTKEYS } from "coral-admin/constants";
import { GetPhrasesRegExpOptions } from "coral-admin/helpers";
import { PropTypesOf } from "coral-framework/types";
@@ -29,7 +30,6 @@ import ApproveButton from "./ApproveButton";
import CommentAuthorContainer from "./CommentAuthorContainer";
import FeatureButton from "./FeatureButton";
import MarkersContainer from "./MarkersContainer";
import MediaContainer from "./MediaContainer";
import RejectButton from "./RejectButton";
import styles from "./ModerateCard.css";
@@ -5,7 +5,7 @@ $moderated-by-username: var(--palette-text-900);
font-size: var(--font-size-1);
font-weight: var(--font-weight-primary-semi-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-3);
line-height: 1.33;
color: $moderated-by;
text-transform: uppercase;
}
@@ -14,7 +14,7 @@ $moderated-by-username: var(--palette-text-900);
font-size: var(--font-size-2);
font-weight: var(--font-weight-secondary-bold);
font-family: var(--font-family-secondary);
line-height: var(--line-height-3);
line-height: 1.14;
color: $moderated-by-username;
text-align: center;
padding-top: 1px;
@@ -5,7 +5,7 @@ $moderateCardToxicityColor: var(--palette-text-500);
font-size: var(--font-size-2);
font-weight: var(--font-weight-primary-semi-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-4);
line-height: 1.285;
color: $moderateCardToxicityColor;
}
@@ -25,6 +25,11 @@ exports[`renders all markers 1`] = `
},
},
},
"metadata": Object {
"wordList": Object {
"timedOut": false,
},
},
},
"status": "PREMOD",
}
@@ -172,6 +177,11 @@ exports[`renders some markers 1`] = `
},
},
},
"metadata": Object {
"wordList": Object {
"timedOut": false,
},
},
},
"status": "PREMOD",
}
@@ -9,7 +9,7 @@
}
.wrapper {
overflow-x: hidden;
overflow: hidden;
/* adjust for button line-height being > 1 */
margin-top: -2px;
}
@@ -20,7 +20,7 @@
width: calc(20 * var(--mini-unit));
margin-right: calc(var(--spacing-1) / 2);
font-size: var(--font-size-3);
line-height: var(--line-height-min);
line-height: 1.2;
justify-content: space-between;
background: var(--palette-background-input);
}
@@ -41,6 +41,6 @@
}
.buttonText {
overflow-x: hidden;
overflow: hidden;
text-overflow: ellipsis;
}
@@ -6,14 +6,16 @@ import SuspensionAction, { SuspensionActionProps } from "./SuspensionAction";
import UsernameChangeAction, {
UsernameChangeActionProps,
} from "./UsernameChangeAction";
import WarningAction, { WarningActionProps } from "./WarningAction";
export interface HistoryActionProps {
kind: "username" | "suspension" | "ban" | "premod";
kind: "username" | "suspension" | "ban" | "premod" | "warning";
action:
| UsernameChangeActionProps
| SuspensionActionProps
| BanActionProps
| PremodActionProps;
| PremodActionProps
| WarningActionProps;
}
const AccountHistoryAction: FunctionComponent<HistoryActionProps> = ({
@@ -31,6 +33,8 @@ const AccountHistoryAction: FunctionComponent<HistoryActionProps> = ({
return <BanAction {...(action as BanActionProps)} />;
case "premod":
return <PremodAction {...(action as PremodActionProps)} />;
case "warning":
return <WarningAction {...(action as WarningActionProps)} />;
default:
return null;
}
@@ -10,7 +10,7 @@ $moderator-note-username: var(--palette-text-900);
font-family: var(--font-family-primary);
font-size: var(--font-size-3);
font-weight: var(--font-weight-primary-regular);
line-height: var(--line-height-field-description);
line-height: 1.3;
background-color: $moderator-note-bg;
border-radius: 4px;
padding: var(--spacing-3);
@@ -25,7 +25,7 @@ $moderator-note-username: var(--palette-text-900);
font-family: var(--font-family-primary);
font-size: var(--font-size-2);
font-weight: var(--font-weight-primary-regular);
line-height: var(--line-height-3);
line-height: 1.14;
padding-left: var(--spacing-4);
padding-right: var(--spacing-1);
position: relative;
@@ -47,8 +47,8 @@ $moderator-note-username: var(--palette-text-900);
.username {
font-family: var(--font-family-secondary);
font-weight: var(--font-weight-secondary-bold);
line-height: var(--line-height-3);
font-size: var(--font-size-3);
line-height: 1;
color: $moderator-note-username;
}
@@ -9,7 +9,7 @@ $recent-history-triggered: var(--palette-error-500);
font-weight: var(--font-weight-primary-bold);
font-size: var(--font-size-3);
margin: 0;
line-height: var(--line-height-field-description);
line-height: 1.3;
color: $recent-history-title;
}
@@ -19,7 +19,7 @@ $recent-history-triggered: var(--palette-error-500);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
margin: 0;
line-height: var(--line-height-4);
line-height: 1.285;
}
.info {
@@ -29,8 +29,7 @@ $recent-history-triggered: var(--palette-error-500);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
font-size: var(--font-size-6);
line-height: var(--line-height-3);
line-height: var(--line-height-3);
line-height: 1;
color: $recent-history-info;
margin: 0;
}
@@ -133,6 +133,30 @@ const UserDrawerAccountHistory: FunctionComponent<Props> = ({ user }) => {
});
});
user.status.warning.history.forEach((record, i) => {
let action: "created" | "acknowledged" | "removed";
if (record.active) {
action = "created";
} else {
if (record.acknowledgedAt) {
action = "acknowledged";
} else {
action = "removed";
}
}
history.push({
kind: "warning",
date: new Date(record.createdAt),
takenBy: record.createdBy.username,
action: {
action,
acknowledgedAt: record.acknowledgedAt
? new Date(record.acknowledgedAt)
: null,
},
});
});
// Sort the history so that it's in the right order.
return history.sort((a, b) => b.date.getTime() - a.date.getTime());
}, [user]);
@@ -193,6 +217,16 @@ const enhanced = withFragmentContainer<any>({
}
}
}
warning {
history {
active
createdBy {
username
}
acknowledgedAt
createdAt
}
}
ban {
history {
active
@@ -29,7 +29,7 @@ $user-drawer-status-label: var(--palette-text-500);
font-family: var(--font-family-secondary);
font-weight: var(--font-weight-secondary-bold);
font-size: var(--font-size-6);
line-height: var(--line-height-3);
line-height: 0.67;
}
.userDetail {
@@ -39,7 +39,7 @@ $user-drawer-status-label: var(--palette-text-500);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-3);
line-height: var(--line-height-3);
line-height: 1;
color: $user-drawer-account-info;
}
@@ -61,7 +61,7 @@ $user-drawer-status-label: var(--palette-text-500);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-bold);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
color: $user-drawer-status-label;
margin-right: var(--spacing-1);
}
@@ -5,7 +5,7 @@ $user-status-details: var(--palette-text-500);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
color: $user-status-details;
line-height: var(--line-height-4);
line-height: 1.285;
margin: 0 0 var(--spacing-1) 0;
}
@@ -1,4 +1,5 @@
import { Localized } from "@fluent/react/compat";
import { last } from "lodash";
import React, { FunctionComponent, useMemo } from "react";
import { graphql } from "react-relay";
@@ -21,18 +22,24 @@ interface Props {
}
const UserStatusDetailsContainer: FunctionComponent<Props> = ({ user }) => {
if (!user.status.ban.active && !user.status.suspension.active) {
return null;
}
const activeBan = useMemo(() => {
return user.status.ban.history.find((item) => item.active);
if (user.status.ban.active) {
return last(user.status.ban.history);
}
return null;
}, [user]);
const activeSuspension = useMemo(() => {
return user.status.suspension.history.find((item) => item.active);
}, [user]);
const activeWarning = useMemo(() => {
if (user.status.warning.active) {
return last(user.status.warning.history);
}
return null;
}, [user]);
const formatter = useDateTimeFormatter({
day: "2-digit",
month: "2-digit",
@@ -41,6 +48,14 @@ const UserStatusDetailsContainer: FunctionComponent<Props> = ({ user }) => {
minute: "2-digit",
});
if (
!user.status.ban.active &&
!user.status.suspension.active &&
!user.status.warning.active
) {
return null;
}
return (
<div>
<Popover
@@ -49,6 +64,37 @@ const UserStatusDetailsContainer: FunctionComponent<Props> = ({ user }) => {
body={({ toggleVisibility }) => (
<ClickOutside onClickOutside={toggleVisibility}>
<Box p={2}>
{activeWarning && (
<div>
<Localized
id="userDetails-warned-on"
$timestamp={formatter(activeWarning.createdAt)}
strong={<strong />}
>
<p className={styles.root}>
<strong>Warned on </strong>{" "}
{formatter(activeWarning.createdAt)}
</p>
</Localized>
{activeWarning.createdBy && (
<Localized
id="userDetails-warned-by"
strong={<strong />}
$username={activeWarning.createdBy.username}
>
<p className={styles.root}>
<strong>by </strong>
{activeWarning.createdBy.username}
</p>
</Localized>
)}
<Localized id="userDetails-warned-explanation">
<p className={styles.root}>
User has not acknowledged the warning.
</p>
</Localized>
</div>
)}
{activeBan && (
<div>
<Localized
@@ -138,6 +184,16 @@ const enhanced = withFragmentContainer<Props>({
user: graphql`
fragment UserStatusDetailsContainer_user on User {
status {
warning {
active
history {
active
createdBy {
username
}
createdAt
}
}
ban {
active
history {
@@ -0,0 +1,43 @@
import { Localized } from "@fluent/react/compat";
import React, { FunctionComponent } from "react";
export interface WarningActionProps {
action: "created" | "removed" | "acknowledged";
acknowledgedAt: Date | null;
}
import { useDateTimeFormatter } from "coral-framework/hooks";
const WarningAction: FunctionComponent<WarningActionProps> = ({
action,
acknowledgedAt,
}) => {
const formatter = useDateTimeFormatter({
hour: "numeric",
minute: "2-digit",
});
if (action === "created") {
return (
<Localized id="moderate-user-drawer-account-history-warning-set">
<span>User warned</span>
</Localized>
);
} else if (action === "removed") {
return (
<Localized id="moderate-user-drawer-account-history-warning-removed">
<span>Warning removed</span>
</Localized>
);
} else if (action === "acknowledged") {
return (
<Localized id="moderate-user-drawer-account-history-warning-acknowledged">
<span>
Warning acknowledged at{" "}
{acknowledgedAt ? formatter(acknowledgedAt) : ""}
</span>
</Localized>
);
}
return null;
};
export default WarningAction;
@@ -56,7 +56,7 @@ const SiteModeratorModal: FunctionComponent<Props> = ({
);
return (
<Modal open={open} onClose={onCancel}>
<Modal open={open} onClose={onCancel} disableScroll>
{({ firstFocusableRef, lastFocusableRef }) => (
<Card className={styles.root}>
<Flex justifyContent="flex-end">
@@ -4,7 +4,7 @@ $ban-modal-text: var(--palette-text-500);
font-size: var(--font-size-3);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
line-height: var(--line-height-field-description);
line-height: 1.3;
color: $ban-modal-text;
}
@@ -0,0 +1,84 @@
import { graphql } from "react-relay";
import { Environment } from "relay-runtime";
import { getViewer } from "coral-framework/helpers";
import {
commitMutationPromiseNormalized,
createMutation,
lookup,
MutationInput,
} from "coral-framework/lib/relay";
import { GQLUser, GQLUSER_STATUS } from "coral-framework/schema";
import { RemoveUserWarningMutation as MutationTypes } from "coral-admin/__generated__/RemoveUserWarningMutation.graphql";
let clientMutationId = 0;
const RemoveUserWarningMutation = createMutation(
"removeUserWarning",
(environment: Environment, input: MutationInput<MutationTypes>) => {
const viewer = getViewer(environment)!;
const now = new Date();
return commitMutationPromiseNormalized<MutationTypes>(environment, {
mutation: graphql`
mutation RemoveUserWarningMutation($input: RemoveUserWarningInput!) {
removeUserWarning(input: $input) {
user {
id
status {
current
warning {
active
history {
active
createdAt
createdBy {
id
username
}
}
}
}
}
clientMutationId
}
}
`,
variables: {
input: {
...input,
clientMutationId: clientMutationId.toString(),
},
},
optimisticResponse: {
removeUserWarning: {
user: {
id: input.userID,
status: {
current: lookup<GQLUser>(
environment,
input.userID
)!.status.current.filter((s) => s !== GQLUSER_STATUS.WARNED),
warning: {
active: false,
history: [
{
active: false,
createdBy: {
id: viewer.id,
username: viewer.username,
},
createdAt: now.toISOString(),
},
],
},
},
},
clientMutationId: (clientMutationId++).toString(),
},
},
});
}
);
export default RemoveUserWarningMutation;
@@ -19,7 +19,7 @@ $suspend-modal-text: var(--palette-text-500);
font-size: var(--font-size-4);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-5);
line-height: 1.11;
color: $suspend-modal-text;
margin: 0;
}
@@ -4,7 +4,7 @@ $suspend-modal-text: var(--palette-text-500);
font-size: var(--font-size-3);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
line-height: var(--line-height-field-description);
line-height: 1.3;
color: $suspend-modal-text;
}
@@ -12,7 +12,7 @@ $suspend-modal-text: var(--palette-text-500);
font-size: var(--font-size-4);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-5);
line-height: 1.11;
color: $suspend-modal-text;
margin: 0;
}
@@ -2,7 +2,7 @@
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
}
.success {
@@ -10,6 +10,7 @@ interface Props {
banned: boolean;
suspended: boolean;
premod: boolean;
warned: boolean;
}
const render = (className: string, content: React.ReactNode) => (
@@ -45,6 +46,14 @@ const UserStatus: FunctionComponent<Props> = (props) => {
</Localized>
);
}
if (props.warned) {
return render(
styles.warning,
<Localized id="userStatus-warned">
<div>Warned</div>
</Localized>
);
}
return render(
styles.success,
<Localized id="userStatus-active">
@@ -32,9 +32,12 @@ interface Props {
onRemoveSuspension: () => void;
onPremod: () => void;
onRemovePremod: () => void;
onWarn: () => void;
onRemoveWarning: () => void;
banned: boolean;
suspended: boolean;
premod: boolean;
warned: boolean;
children: React.ReactNode;
fullWidth?: boolean;
bordered?: boolean;
@@ -47,6 +50,9 @@ const UserStatusChange: FunctionComponent<Props> = ({
onRemoveSuspension,
onPremod,
onRemovePremod,
onWarn,
onRemoveWarning,
warned,
banned,
suspended,
premod,
@@ -143,6 +149,37 @@ const UserStatusChange: FunctionComponent<Props> = ({
</DropdownButton>
</Localized>
)}
{warned ? (
<Localized id="community-userStatus-removeWarning">
<DropdownButton
className={styles.dropdownButton}
disabled={!onRemoveWarning}
onClick={() => {
if (onRemoveWarning) {
onRemoveWarning();
toggleVisibility();
}
}}
>
Remove warning
</DropdownButton>
</Localized>
) : (
<Localized id="community-userStatus-warn">
<DropdownButton
className={styles.dropdownButton}
disabled={!onWarn}
onClick={() => {
if (onWarn) {
onWarn();
toggleVisibility();
}
}}
>
Warn
</DropdownButton>
</Localized>
)}
</Dropdown>
</ClickOutside>
)}
@@ -15,10 +15,13 @@ import PremodUserMutation from "./PremodUserMutation";
import RemoveUserBanMutation from "./RemoveUserBanMutation";
import RemoveUserPremodMudtaion from "./RemoveUserPremodMutation";
import RemoveUserSuspensionMutation from "./RemoveUserSuspensionMutation";
import RemoveUserWarningMutation from "./RemoveUserWarningMutation";
import SuspendModal from "./SuspendModal";
import SuspendUserMutation from "./SuspendUserMutation";
import UserStatusChange from "./UserStatusChange";
import UserStatusContainer from "./UserStatusContainer";
import WarnModal from "./WarnModal";
import WarnUserMutation from "./WarnUserMutation";
interface Props {
settings: UserStatusChangeContainer_settings;
@@ -41,10 +44,37 @@ const UserStatusChangeContainer: FunctionComponent<Props> = ({
const removeUserSuspension = useMutation(RemoveUserSuspensionMutation);
const premodUser = useMutation(PremodUserMutation);
const removeUserPremod = useMutation(RemoveUserPremodMudtaion);
const warnUser = useMutation(WarnUserMutation);
const removeUserWarning = useMutation(RemoveUserWarningMutation);
const [showPremod, setShowPremod] = useState<boolean>(false);
const [showBanned, setShowBanned] = useState<boolean>(false);
const [showSuspend, setShowSuspend] = useState<boolean>(false);
const [showWarn, setShowWarn] = useState<boolean>(false);
const [showSuspendSuccess, setShowSuspendSuccess] = useState<boolean>(false);
const [showWarnSuccess, setShowWarnSuccess] = useState<boolean>(false);
const handleWarn = useCallback(() => {
if (user.status.warning.active) {
return;
}
setShowWarn(true);
}, [user, setShowWarn]);
const handleRemoveWarning = useCallback(() => {
if (!user.status.warning.active) {
return;
}
void removeUserWarning({ userID: user.id });
}, [user, removeUserWarning]);
const hideWarn = useCallback(() => {
setShowWarn(false);
setShowWarnSuccess(false);
}, [setShowWarn]);
const handleWarnConfirm = useCallback(
(message: string) => {
void warnUser({ userID: user.id, message });
setShowWarnSuccess(true);
},
[warnUser, user, setShowWarnSuccess]
);
const handleBan = useCallback(() => {
if (user.status.ban.active) {
return;
@@ -91,12 +121,12 @@ const UserStatusChangeContainer: FunctionComponent<Props> = ({
return;
}
void removeUserPremod({ userID: user.id });
}, [user, premodUser]);
}, [user, removeUserPremod]);
const handleSuspendModalClose = useCallback(() => {
setShowSuspend(false);
setShowSuspendSuccess(false);
}, [setShowBanned, setShowSuspendSuccess]);
}, [setShowSuspendSuccess]);
const handleBanModalClose = useCallback(() => {
setShowBanned(false);
@@ -119,7 +149,7 @@ const UserStatusChangeContainer: FunctionComponent<Props> = ({
void banUser({ userID: user.id, message, rejectExistingComments });
setShowBanned(false);
},
[user, setShowBanned]
[user, setShowBanned, banUser]
);
if (user.role !== GQLUSER_ROLE.COMMENTER) {
@@ -140,6 +170,9 @@ const UserStatusChangeContainer: FunctionComponent<Props> = ({
banned={user.status.ban.active}
suspended={user.status.suspension.active}
premod={user.status.premod.active}
warned={user.status.warning.active}
onWarn={handleWarn}
onRemoveWarning={handleRemoveWarning}
fullWidth={fullWidth}
bordered={bordered}
>
@@ -159,6 +192,14 @@ const UserStatusChangeContainer: FunctionComponent<Props> = ({
onClose={hidePremod}
onConfirm={handlePremodConfirm}
/>
<WarnModal
username={user.username}
organizationName={settings.organization.name}
open={showWarn}
onClose={hideWarn}
onConfirm={handleWarnConfirm}
success={showWarnSuccess}
/>
{!scoped && (
<BanModal
username={user.username}
@@ -187,6 +228,9 @@ const enhanced = withFragmentContainer<Props>({
premod {
active
}
warning {
active
}
}
...UserStatusContainer_user
}
@@ -18,6 +18,7 @@ const UserStatusContainer: FunctionComponent<Props> = (props) => {
banned={props.user.status.current.includes(GQLUSER_STATUS.BANNED)}
suspended={props.user.status.current.includes(GQLUSER_STATUS.SUSPENDED)}
premod={props.user.status.current.includes(GQLUSER_STATUS.PREMOD)}
warned={props.user.status.current.includes(GQLUSER_STATUS.WARNED)}
/>
);
};
@@ -0,0 +1,10 @@
.label {
margin-bottom: 0;
}
.required {
color: var(--palette-text-100);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
}
@@ -0,0 +1,86 @@
import { Localized } from "@fluent/react/compat";
import React, { FunctionComponent, RefObject, useCallback } from "react";
import { Field, Form } from "react-final-form";
import { required } from "coral-framework/lib/validation";
import {
Button,
Flex,
HelperText,
HorizontalGutter,
Label,
Textarea,
} from "coral-ui/components/v2";
import styles from "./WarnForm.css";
interface Props {
onCancel: () => void;
onSubmit: (message: string) => void;
lastFocusableRef: RefObject<any>;
}
const WarnForm: FunctionComponent<Props> = ({
onCancel,
onSubmit,
lastFocusableRef,
}) => {
const onFormSubmit = useCallback(
({ message }) => {
onSubmit(message);
},
[onSubmit]
);
return (
<>
<Form onSubmit={onFormSubmit}>
{({ handleSubmit, invalid, form }) => (
<form onSubmit={handleSubmit}>
<HorizontalGutter spacing={3}>
<HorizontalGutter spacing={1}>
<Flex alignItems="baseline" spacing={1}>
<Localized id="community-warnModal-message-label">
<Label className={styles.label}>Message</Label>
</Localized>
<Localized id="community-warnModal-message-required">
<span className={styles.required}>Required</span>
</Localized>
</Flex>
<Localized id="community-warnModal-message-description">
<HelperText>
Explain to this user how they should change their behavior
on your site.
</HelperText>
</Localized>
</HorizontalGutter>
<Field component="textarea" name="message" validate={required}>
{({ input }) => (
<Textarea id="warnModal-message" {...input} fullwidth />
)}
</Field>
<Flex justifyContent="flex-end" itemGutter="half">
<Localized id="community-warnModal-cancel">
<Button variant="flat" onClick={onCancel}>
Cancel
</Button>
</Localized>
<Localized id="community-warnModal-warnUser">
<Button
ref={lastFocusableRef}
type="submit"
disabled={invalid}
>
Warn User
</Button>
</Localized>
</Flex>
</HorizontalGutter>
</form>
)}
</Form>
</>
);
};
export default WarnForm;
@@ -0,0 +1,103 @@
import { Localized } from "@fluent/react/compat";
import React, { FunctionComponent, useCallback } from "react";
import NotAvailable from "coral-admin/components/NotAvailable";
import { Button, Flex, HorizontalGutter } from "coral-ui/components/v2";
import ModalBodyText from "../ModalBodyText";
import ModalHeader from "../ModalHeader";
import ModalHeaderUsername from "../ModalHeaderUsername";
import ChangeStatusModal from "./ChangeStatusModal";
import WarnForm from "./WarnForm";
interface Props {
username: string | null;
open: boolean;
onClose: () => void;
onConfirm: (message: string) => void;
organizationName: string;
success: boolean;
}
const WarnModal: FunctionComponent<Props> = ({
open,
onClose,
onConfirm,
username,
organizationName,
success,
}) => {
const onFormSubmit = useCallback(
(message: string) => {
onConfirm(message);
},
[onConfirm]
);
return (
<ChangeStatusModal
open={open}
onClose={onClose}
aria-labelledby="warnModal-title"
>
{({ lastFocusableRef }) => (
<>
{success && (
<HorizontalGutter spacing={3}>
<Localized
id="community-warnModal-success"
$username={username}
strong={<ModalHeaderUsername />}
>
<ModalHeader>
A warning has been sent to{" "}
<ModalHeaderUsername>{username}</ModalHeaderUsername>
</ModalHeader>
</Localized>
<Flex justifyContent="flex-end" itemGutter="half">
<Localized id="community-suspendModal-success-close">
<Button ref={lastFocusableRef} onClick={onClose}>
Ok
</Button>
</Localized>
</Flex>
</HorizontalGutter>
)}
{!success && (
<HorizontalGutter spacing={3}>
<Localized
id="community-warnModal-areYouSure"
strong={<ModalHeaderUsername />}
$username={username || <NotAvailable />}
>
<ModalHeader id="warnModal-title">
Warn{" "}
<ModalHeaderUsername>
{username || <NotAvailable />}
</ModalHeaderUsername>
?
</ModalHeader>
</Localized>
<Localized id="community-warnModal-consequence">
<ModalBodyText>
A warning can improve a commenters conduct without a
suspension or ban. The user must acknowledge the warning
before they can continue commenting.
</ModalBodyText>
</Localized>
<WarnForm
onCancel={onClose}
onSubmit={onFormSubmit}
lastFocusableRef={lastFocusableRef}
/>
</HorizontalGutter>
)}
</>
)}
</ChangeStatusModal>
);
};
export default WarnModal;
@@ -0,0 +1,84 @@
import { graphql } from "react-relay";
import { Environment } from "relay-runtime";
import { getViewer } from "coral-framework/helpers";
import {
commitMutationPromiseNormalized,
createMutation,
lookup,
MutationInput,
} from "coral-framework/lib/relay";
import { GQLUser, GQLUSER_STATUS } from "coral-framework/schema";
import { WarnUserMutation as MutationTypes } from "coral-admin/__generated__/WarnUserMutation.graphql";
let clientMutationId = 0;
const WarnUserMutation = createMutation(
"warnUser",
(environment: Environment, input: MutationInput<MutationTypes>) => {
const viewer = getViewer(environment)!;
const now = new Date();
return commitMutationPromiseNormalized<MutationTypes>(environment, {
mutation: graphql`
mutation WarnUserMutation($input: WarnUserInput!) {
warnUser(input: $input) {
user {
id
status {
current
warning {
active
history {
active
createdAt
createdBy {
id
username
}
}
}
}
}
clientMutationId
}
}
`,
variables: {
input: {
...input,
clientMutationId: clientMutationId.toString(),
},
},
optimisticResponse: {
warnUser: {
user: {
id: input.userID,
status: {
current: lookup<GQLUser>(
environment,
input.userID
)!.status.current.concat(GQLUSER_STATUS.WARNED),
warning: {
active: true,
history: [
{
active: true,
createdBy: {
id: viewer.id,
username: viewer.username,
},
createdAt: now.toISOString(),
},
],
},
},
},
clientMutationId: (clientMutationId++).toString(),
},
},
});
}
);
export default WarnUserMutation;
+1
View File
@@ -20,6 +20,7 @@ async function main() {
const ManagedCoralContextProvider = await createManaged({
initLocalState,
localesData,
bundle: "admin",
});
const Index: FunctionComponent = () => (
@@ -100,10 +100,34 @@ const RejectCommentMutation = createMutation(
proxy.setValue(true, "viewerDidModerate");
const connections = [
getQueueConnection(store, "REPORTED", input.storyID),
getQueueConnection(store, "PENDING", input.storyID),
getQueueConnection(store, "UNMODERATED", input.storyID),
getQueueConnection(store, "APPROVED", input.storyID),
getQueueConnection(
store,
"REPORTED",
input.storyID,
input.siteID,
input.section
),
getQueueConnection(
store,
"PENDING",
input.storyID,
input.siteID,
input.section
),
getQueueConnection(
store,
"UNMODERATED",
input.storyID,
input.siteID,
input.section
),
getQueueConnection(
store,
"APPROVED",
input.storyID,
input.siteID,
input.section
),
].filter((c) => c);
connections.forEach((con) =>
ConnectionHandler.deleteNode(con!, input.commentID)
@@ -3,7 +3,7 @@
font-family: var(--font-family-secondary);
color: var(--palette-text-100);
font-size: var(--font-size-3);
line-height: var(--line-height-4);
line-height: 1.285;
padding-bottom: var(--spacing-3);
}
@@ -12,7 +12,7 @@
font-size: var(--font-size-6);
font-weight: var(--font-weight-secondary-bold);
font-family: var(--font-family-secondary);
line-height: var(--line-height-7);
line-height: 1.17;
color: var(--palette-text-900);
text-align: center;
@@ -24,7 +24,7 @@
font-size: var(--font-size-3);
font-weight: var(--font-weight-primary-regular);
font-family: var(--font-family-primary);
line-height: var(--line-height-4);
line-height: 1.125;
color: var(--palette-text-500);
text-align: center;
@@ -39,7 +39,7 @@
font-size: var(--font-size-4);
font-weight: var(--font-weight-primary-semi-bold);
font-family: var(--font-family-primary);
line-height: var(--line-height-3);
line-height: 0.89;
color: var(--palette-text-900);
text-align: center;
@@ -3,7 +3,7 @@ import React, { Component } from "react";
import { graphql } from "react-relay";
import { SetRedirectPathMutation } from "coral-admin/mutations";
import { timeout } from "coral-common/utils";
import { waitFor } from "coral-common/helpers";
import {
MutationProp,
withFragmentContainer,
@@ -31,7 +31,7 @@ class RestrictedContainer extends Component<Props> {
private handleSignInAs = async () => {
await this.props.signOut();
// Wait for new context to propagate.
await timeout();
await waitFor();
void this.props.setRedirectPath({
path: location.pathname + location.search + location.hash,
});
@@ -2,6 +2,6 @@
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-3);
line-height: var(--line-height-field-description);
line-height: 1.3;
text-align: center;
}
@@ -4,6 +4,6 @@ $invite-form-text: var(--palette-text-500);
font-size: var(--font-size-3);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
line-height: var(--line-height-field-description);
line-height: 1.3;
color: $invite-form-text;
}
@@ -10,7 +10,7 @@ $invite-modal-text: var(--palette-text-500);
font-size: var(--font-size-5);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-6);
line-height: 1.2;
color: $invite-modal-text;
margin: 0;
}
@@ -4,6 +4,6 @@ $role-field-text: var(--palette-text-500);
font-size: var(--font-size-3);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-field-description);
line-height: 1.3;
color: $role-field-text;
}
@@ -7,7 +7,7 @@ $success-text: var(--palette-text-500);
font-size: var(--font-size-5);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-6);
line-height: 1.2;
color: $success-text;
margin: 0;
}
@@ -24,8 +24,8 @@
padding: 0px;
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-3);
font-size: var(--font-size-2);
line-height: 1.14;
}
.username {
@@ -6,6 +6,6 @@ $configureHeadingForegroundColor: var(--palette-text-000);
color: $configureHeadingForegroundColor;
font-size: var(--font-size-3);
font-weight: var(--font-weight-primary-bold);
line-height: var(--line-height-3);
line-height: 1;
font-family: var(--font-family-primary);
}
@@ -3,5 +3,5 @@
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-4);
line-height: 1.285;
}
@@ -7,7 +7,7 @@ $sideNavActiveColor: var(--palette-text-500);
color: $sideNavItemColor;
font-family: var(--font-family-primary);
font-size: var(--font-size-4);
line-height: var(--line-height-5);
line-height: 1.11;
font-weight: var(--font-weight-primary-regular);
display: inline-block;
padding: var(--spacing-2) var(--spacing-2)
@@ -6,5 +6,5 @@
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
}
@@ -2,7 +2,7 @@
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-regular);
font-size: var(--font-size-2);
line-height: var(--line-height-3);
line-height: 1.14;
border-radius: 2px;
padding-left: var(--spacing-1);
@@ -9,7 +9,7 @@ $announcement-modal-text: var(--palette-text-500);
font-size: var(--font-size-5);
font-family: var(--font-family-primary);
font-weight: var(--font-weight-primary-semi-bold);
line-height: var(--line-height-6);
line-height: 1.2;
color: $announcement-modal-text;
margin: 0;
}
@@ -122,7 +122,7 @@ const AnnouncementForm: FunctionComponent<Props> = ({
</HorizontalGutter>
<Flex itemGutter justifyContent="flex-end">
<Localized id="configure-general-announcements-cancel">
<Button color="mono" variant="outline" onClick={onClose}>
<Button color="mono" variant="outlined" onClick={onClose}>
Cancel
</Button>
</Localized>
@@ -7,5 +7,5 @@
font-size: var(--font-size-3);
font-weight: var(--font-weight-primary-regular);
font-family: var(--font-family-primary);
line-height: var(--line-height-4);
line-height: 1.125;
}

Some files were not shown because too many files have changed in this diff Show More