From 808b355a27c31ac68dfca6c17dc89df81cc2e66f Mon Sep 17 00:00:00 2001 From: Vinh Date: Wed, 2 Oct 2019 02:22:15 +0700 Subject: [PATCH] [CORL-181] Comment Count Injection (#2581) * feat: inject comment counts * fix: tests * feat: integrate stream embed with coral counts * chore: refactor constants * test: test for count bundle * test: test live comment count integration with stream embed * feat: use defer * fix: snapshot * feat: auto add count.js in when calling Coral.createStreamEmbed * fix: tests * fix: rm duplicate test * chore: remove unuse file --- config/jest/client.config.js | 1 + src/core/build/createWebpackConfig.ts | 39 ++++++++ src/core/build/paths.ts | 3 + .../Configure/sections/Advanced/EmbedCode.tsx | 4 +- .../__snapshots__/advanced.spec.tsx.snap | 4 +- .../client/count/getCurrentScriptOrigin.ts | 27 ++++++ src/core/client/count/index.html | 23 +++++ src/core/client/count/index.ts | 61 ++++++++++++ src/core/client/count/injectJSONPCallback.ts | 18 ++++ .../test/__snapshots__/basic.spec.ts.snap | 95 +++++++++++++++++++ src/core/client/count/test/basic.spec.ts | 53 +++++++++++ src/core/client/embed/Coral.ts | 20 +--- src/core/client/embed/StreamEmbed.ts | 7 ++ .../withLiveCommentCount.spec.ts.snap | 70 ++++++++++++++ src/core/client/embed/decorators/index.ts | 1 + .../decorators/withLiveCommentCount.spec.ts | 46 +++++++++ .../embed/decorators/withLiveCommentCount.ts | 32 +++++++ .../client/embed/injectCountScriptIfNeeded.ts | 22 +++++ src/core/client/embed/story.html | 3 + src/core/client/embed/storyButton.html | 3 + .../__snapshots__/basic.spec.ts.snap} | 0 .../{index.spec.ts => test/basic.spec.ts} | 2 +- src/core/client/embed/test/count.spec.ts | 57 +++++++++++ src/core/client/framework/constants.ts | 12 +++ .../framework/helpers/detectCountScript.ts | 7 ++ src/core/client/framework/helpers/index.ts | 2 + .../framework/helpers/resolveStoryURL.ts | 19 ++++ .../framework}/utils/getLocationOrigin.ts | 0 src/core/client/framework/utils/index.ts | 2 + src/core/client/framework/utils/jsonp.ts | 29 ++++++ .../tabs/Comments/Stream/StreamContainer.tsx | 6 ++ .../Comments/Stream/useCommentCountEvent.ts | 40 ++++++++ .../ChangeUsernameContainer.tsx | 2 +- .../comments/stream/emitCountEvents.spec.tsx | 56 +++++++++++ .../renderConfigure.spec.tsx.snap | 10 +- .../__snapshots__/account.spec.tsx.snap | 2 +- src/core/client/tsconfig.json | 1 + src/core/common/utils/index.ts | 1 - src/core/server/app/handlers/api/index.ts | 1 + .../server/app/handlers/api/story/count.ts | 71 ++++++++++++++ .../server/app/handlers/api/story/index.ts | 1 + src/core/server/app/router/api/index.ts | 2 + src/core/server/app/router/api/story.ts | 13 +++ .../graph/tenant/resolvers/CommentCounts.ts | 12 +-- src/core/server/locales/en-US/common.ftl | 7 ++ src/core/server/models/comment/helpers.ts | 6 +- src/core/server/models/story/counts/index.ts | 14 +++ src/locales/en-US/stream.ftl | 31 +++--- 48 files changed, 888 insertions(+), 50 deletions(-) create mode 100644 src/core/client/count/getCurrentScriptOrigin.ts create mode 100644 src/core/client/count/index.html create mode 100644 src/core/client/count/index.ts create mode 100644 src/core/client/count/injectJSONPCallback.ts create mode 100644 src/core/client/count/test/__snapshots__/basic.spec.ts.snap create mode 100644 src/core/client/count/test/basic.spec.ts create mode 100644 src/core/client/embed/decorators/__snapshots__/withLiveCommentCount.spec.ts.snap create mode 100644 src/core/client/embed/decorators/withLiveCommentCount.spec.ts create mode 100644 src/core/client/embed/decorators/withLiveCommentCount.ts create mode 100644 src/core/client/embed/injectCountScriptIfNeeded.ts rename src/core/client/embed/{__snapshots__/index.spec.ts.snap => test/__snapshots__/basic.spec.ts.snap} (100%) rename src/core/client/embed/{index.spec.ts => test/basic.spec.ts} (98%) create mode 100644 src/core/client/embed/test/count.spec.ts create mode 100644 src/core/client/framework/constants.ts create mode 100644 src/core/client/framework/helpers/detectCountScript.ts create mode 100644 src/core/client/framework/helpers/resolveStoryURL.ts rename src/core/{common => client/framework}/utils/getLocationOrigin.ts (100%) create mode 100644 src/core/client/framework/utils/jsonp.ts create mode 100644 src/core/client/stream/tabs/Comments/Stream/useCommentCountEvent.ts create mode 100644 src/core/client/stream/test/comments/stream/emitCountEvents.spec.tsx create mode 100644 src/core/server/app/handlers/api/story/count.ts create mode 100644 src/core/server/app/handlers/api/story/index.ts create mode 100644 src/core/server/app/router/api/story.ts diff --git a/config/jest/client.config.js b/config/jest/client.config.js index 421848cc5..816d58b7b 100644 --- a/config/jest/client.config.js +++ b/config/jest/client.config.js @@ -29,6 +29,7 @@ module.exports = { "^coral-account/(.*)$": "/src/core/client/account/$1", "^coral-admin/(.*)$": "/src/core/client/admin/$1", "^coral-auth/(.*)$": "/src/core/client/auth/$1", + "^coral-count/(.*)$": "/src/core/client/count/$1", "^coral-ui/(.*)$": "/src/core/client/ui/$1", "^coral-stream/(.*)$": "/src/core/client/stream/$1", "^coral-framework/(.*)$": "/src/core/client/framework/$1", diff --git a/src/core/build/createWebpackConfig.ts b/src/core/build/createWebpackConfig.ts index 4a2452400..22fbb8daa 100644 --- a/src/core/build/createWebpackConfig.ts +++ b/src/core/build/createWebpackConfig.ts @@ -752,5 +752,44 @@ export default function createWebpackConfig( ), ]), }, + /* Webpack config for count */ + { + ...baseConfig, + optimization: { + ...baseConfig.optimization, + // Ensure that we never split the count into chunks. + splitChunks: { + chunks: "async", + }, + // We can turn on sideEffects here as we don't use + // css here and don't run into: https://github.com/webpack/webpack/issues/7094 + sideEffects: true, + }, + entry: [paths.appCountIndex], + output: { + ...baseConfig.output, + // don't hash the count, cache-busting must be completed by the requester + // as this lives in a static template on the embed site. + filename: "assets/js/count.js", + }, + plugins: filterPlugins([ + ...baseConfig.plugins!, + ...ifWatch( + // Generates an `embed.html` file with the