diff --git a/src/commands/Article.ts b/src/commands/Article.ts index c0299311..bbac62a3 100644 --- a/src/commands/Article.ts +++ b/src/commands/Article.ts @@ -1,5 +1,5 @@ import { isValidFile } from './../helpers/isValidFile'; -import { SETTING_AUTO_UPDATE_DATE, SETTING_MODIFIED_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_TEMPLATES_PREFIX, CONFIG_KEY, SETTING_DATE_FORMAT, SETTING_SLUG_PREFIX, SETTING_SLUG_SUFFIX, SETTINGS_CONTENT_PLACEHOLDERS } from './../constants'; +import { SETTING_AUTO_UPDATE_DATE, SETTING_MODIFIED_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_TEMPLATES_PREFIX, CONFIG_KEY, SETTING_DATE_FORMAT, SETTING_SLUG_PREFIX, SETTING_SLUG_SUFFIX, SETTINGS_CONTENT_PLACEHOLDERS, TelemetryEvent } from './../constants'; import * as vscode from 'vscode'; import { Field, TaxonomyType } from "../models"; import { format } from "date-fns"; @@ -12,7 +12,7 @@ import { DashboardData } from '../models/DashboardData'; import { ExplorerView } from '../explorerView/ExplorerView'; import { DateHelper } from '../helpers/DateHelper'; import { parseWinPath } from '../helpers/parseWinPath'; -import { Telemetry, TelemetryEvent } from '../helpers/Telemetry'; +import { Telemetry } from '../helpers/Telemetry'; export class Article { diff --git a/src/commands/Dashboard.ts b/src/commands/Dashboard.ts index 23e4900c..ac2f8a5b 100644 --- a/src/commands/Dashboard.ts +++ b/src/commands/Dashboard.ts @@ -10,8 +10,7 @@ import { WebviewHelper } from '@estruyf/vscode'; import { DashboardData } from '../models/DashboardData'; import { ExplorerView } from '../explorerView/ExplorerView'; import { MediaLibrary } from '../helpers/MediaLibrary'; -import { DashboardListener, MediaListener, SettingsListener } from '../listeners'; -import { DataListener } from '../listeners/DataListener'; +import { DashboardListener, MediaListener, SettingsListener, TelemetryListener, DataListener } from '../listeners'; export class Dashboard { private static webview: WebviewPanel | null = null; @@ -146,6 +145,7 @@ export class Dashboard { PagesListener.process(msg); SettingsListener.process(msg); DataListener.process(msg); + TelemetryListener.process(msg); }); } diff --git a/src/commands/Folders.ts b/src/commands/Folders.ts index c2ebdd78..47546262 100644 --- a/src/commands/Folders.ts +++ b/src/commands/Folders.ts @@ -1,5 +1,5 @@ import { Questions } from './../helpers/Questions'; -import { SETTINGS_CONTENT_PAGE_FOLDERS, SETTINGS_CONTENT_STATIC_FOLDER, SETTINGS_CONTENT_SUPPORTED_FILETYPES } from './../constants'; +import { SETTINGS_CONTENT_PAGE_FOLDERS, SETTINGS_CONTENT_STATIC_FOLDER, SETTINGS_CONTENT_SUPPORTED_FILETYPES, TelemetryEvent } from './../constants'; import { commands, Uri, workspace, window } from "vscode"; import { basename, join } from "path"; import { ContentFolder, FileInfo, FolderInfo } from "../models"; @@ -14,7 +14,7 @@ import { parseWinPath } from '../helpers/parseWinPath'; import { MediaHelpers } from '../helpers/MediaHelpers'; import { MediaListener, PagesListener } from '../listeners'; import { DEFAULT_FILE_TYPES } from '../constants/DefaultFileTypes'; -import { Telemetry, TelemetryEvent } from '../helpers/Telemetry'; +import { Telemetry } from '../helpers/Telemetry'; export const WORKSPACE_PLACEHOLDER = `[[workspace]]`; diff --git a/src/commands/Preview.ts b/src/commands/Preview.ts index c4372101..c7ae7132 100644 --- a/src/commands/Preview.ts +++ b/src/commands/Preview.ts @@ -1,5 +1,5 @@ -import { Telemetry, TelemetryEvent } from './../helpers/Telemetry'; -import { SETTING_PREVIEW_HOST, SETTING_PREVIEW_PATHNAME, CONTEXT } from './../constants'; +import { Telemetry } from './../helpers/Telemetry'; +import { SETTING_PREVIEW_HOST, SETTING_PREVIEW_PATHNAME, CONTEXT, TelemetryEvent } from './../constants'; import { ArticleHelper } from './../helpers/ArticleHelper'; import { join } from "path"; import { commands, env, Uri, ViewColumn, window } from "vscode"; diff --git a/src/commands/Project.ts b/src/commands/Project.ts index 509266ec..b6dddbd2 100644 --- a/src/commands/Project.ts +++ b/src/commands/Project.ts @@ -1,4 +1,4 @@ -import { Telemetry, TelemetryEvent } from './../helpers/Telemetry'; +import { Telemetry } from './../helpers/Telemetry'; import { workspace, Uri } from "vscode"; import { join } from "path"; import * as fs from "fs"; @@ -6,7 +6,7 @@ import { Notifications } from "../helpers/Notifications"; import { Template } from "./Template"; import { Folders } from "./Folders"; import { Settings } from "../helpers"; -import { SETTINGS_CONTENT_DEFAULT_FILETYPE } from "../constants"; +import { SETTINGS_CONTENT_DEFAULT_FILETYPE, TelemetryEvent } from "../constants"; export class Project { diff --git a/src/commands/Template.ts b/src/commands/Template.ts index 120cc778..1e38c4f0 100644 --- a/src/commands/Template.ts +++ b/src/commands/Template.ts @@ -2,7 +2,7 @@ import { Questions } from './../helpers/Questions'; import * as vscode from 'vscode'; import * as path from 'path'; import * as fs from 'fs'; -import { SETTINGS_CONTENT_DEFAULT_FILETYPE, SETTING_TEMPLATES_FOLDER, SETTING_TEMPLATES_PREFIX } from '../constants'; +import { SETTINGS_CONTENT_DEFAULT_FILETYPE, SETTING_TEMPLATES_FOLDER, TelemetryEvent } from '../constants'; import { ArticleHelper, Settings } from '../helpers'; import { Article } from '.'; import { Notifications } from '../helpers/Notifications'; @@ -13,7 +13,7 @@ import { ContentType } from '../helpers/ContentType'; import { ContentType as IContentType } from '../models'; import { PagesListener } from '../listeners'; import { extname } from 'path'; -import { Telemetry, TelemetryEvent } from '../helpers/Telemetry'; +import { Telemetry } from '../helpers/Telemetry'; export class Template { diff --git a/src/constants/TelemetryEvent.ts b/src/constants/TelemetryEvent.ts new file mode 100644 index 00000000..dfca5182 --- /dev/null +++ b/src/constants/TelemetryEvent.ts @@ -0,0 +1,28 @@ +export const TelemetryEvent = { + activate: 'activate', + initialization: 'initialization', + openContentDashboard: 'openContentDashboard', + openMediaDashboard: 'openMediaDashboard', + openDataDashboard: 'openDataDashboard', + closeDashboard: 'closeDashboard', + generateSlug: 'generateSlug', + createContentFromTemplate: 'createContentFromTemplate', + createContentFromContentType: 'createContentFromContentType', + registerFolder: 'registerFolder', + unregisterFolder: 'unregisterFolder', + addMediaFolder: 'addMediaFolder', + promoteSettings: 'promoteSettings', + openPreview: 'openPreview', + uploadMedia: 'uploadMedia', + refreshMedia: 'refreshMedia', + deleteMedia: 'deleteMedia', + insertMediaToContent: 'insertMediaToContent', + updateMediaMetadata: 'updateMediaMetadata', + openExplorerView: 'openExplorerView', + + // Webviews + webviewWelcomeScreen: 'webviewWelcomeScreen', + webviewMediaView: 'webviewMediaView', + webviewDataView: 'webviewDataView', + webviewContentsView: 'webviewContentsView', +}; \ No newline at end of file diff --git a/src/constants/index.ts b/src/constants/index.ts index fad8cc87..9ae33331 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1,10 +1,13 @@ export * from './ContentType'; export * from './DefaultFields'; +export * from './DefaultFileTypes'; export * from './Extension'; export * from './ExtensionState'; +export * from './FrameworkDetectors'; export * from './Links'; export * from './LocalStore'; export * from './Navigation'; +export * from './TelemetryEvent'; export * from './charMap'; export * from './context'; export * from './settings'; diff --git a/src/dashboardWebView/DashboardMessage.ts b/src/dashboardWebView/DashboardMessage.ts index f7e4cab3..c64974a0 100644 --- a/src/dashboardWebView/DashboardMessage.ts +++ b/src/dashboardWebView/DashboardMessage.ts @@ -24,4 +24,5 @@ export enum DashboardMessage { runCustomScript = 'runCustomScript', getDataEntries = 'getDataEntries', putDataEntries = 'putDataEntries', + sendTelemetry = 'sendTelemetry', } \ No newline at end of file diff --git a/src/dashboardWebView/components/Contents/Contents.tsx b/src/dashboardWebView/components/Contents/Contents.tsx index f3f90357..25c2718e 100644 --- a/src/dashboardWebView/components/Contents/Contents.tsx +++ b/src/dashboardWebView/components/Contents/Contents.tsx @@ -7,6 +7,10 @@ import { Overview } from './Overview'; import { Spinner } from '../Spinner'; import { SponsorMsg } from '../SponsorMsg'; import usePages from '../../hooks/usePages'; +import { useEffect } from 'react'; +import { Messenger } from '@estruyf/vscode/dist/client'; +import { DashboardMessage } from '../../DashboardMessage'; +import { TelemetryEvent } from '../../../constants'; export interface IContentsProps { pages: Page[]; @@ -19,6 +23,12 @@ export const Contents: React.FunctionComponent = ({pages, loadin const pageFolders = [...new Set(pageItems.map(page => page.fmFolder))]; + useEffect(() => { + Messenger.send(DashboardMessage.sendTelemetry, { + event: TelemetryEvent.webviewContentsView + }); + }, []); + return (
= (props: React.P useEffect(() => { Messenger.listen(messageListener); + + Messenger.send(DashboardMessage.sendTelemetry, { + event: TelemetryEvent.webviewDataView + }); return () => { Messenger.unlisten(messageListener); diff --git a/src/dashboardWebView/components/Media/Media.tsx b/src/dashboardWebView/components/Media/Media.tsx index 9b68ddf9..7263ac25 100644 --- a/src/dashboardWebView/components/Media/Media.tsx +++ b/src/dashboardWebView/components/Media/Media.tsx @@ -13,11 +13,12 @@ import { Item } from './Item'; import { Lightbox } from './Lightbox'; import { List } from './List'; import { useDropzone } from 'react-dropzone' -import { useCallback } from 'react'; +import { useCallback, useEffect } from 'react'; import { DashboardMessage } from '../../DashboardMessage'; import { FrontMatterIcon } from '../../../panelWebView/components/Icons/FrontMatterIcon'; import { FolderItem } from './FolderItem'; import useMedia from '../../hooks/useMedia'; +import { TelemetryEvent } from '../../../constants'; export interface IMediaProps {} @@ -46,6 +47,12 @@ export const Media: React.FunctionComponent = (props: React.PropsWi }); }, [selectedFolder]); + useEffect(() => { + Messenger.send(DashboardMessage.sendTelemetry, { + event: TelemetryEvent.webviewMediaView + }); + }, []); + const {getRootProps, isDragActive} = useDropzone({ onDrop, accept: 'image/*' diff --git a/src/dashboardWebView/components/WelcomeScreen.tsx b/src/dashboardWebView/components/WelcomeScreen.tsx index 467521cb..985920f6 100644 --- a/src/dashboardWebView/components/WelcomeScreen.tsx +++ b/src/dashboardWebView/components/WelcomeScreen.tsx @@ -1,6 +1,6 @@ import {HeartIcon, StarIcon} from '@heroicons/react/outline'; import * as React from 'react'; -import { GITHUB_LINK, REVIEW_LINK, SPONSOR_LINK } from '../../constants'; +import { GITHUB_LINK, REVIEW_LINK, SPONSOR_LINK, TelemetryEvent } from '../../constants'; import { Messenger } from '@estruyf/vscode/dist/client'; import { FrontMatterIcon } from '../../panelWebView/components/Icons/FrontMatterIcon'; import { GitHubIcon } from '../../panelWebView/components/Icons/GitHubIcon'; @@ -15,10 +15,15 @@ export interface IWelcomeScreenProps { export const WelcomeScreen: React.FunctionComponent = ({settings}: React.PropsWithChildren) => { React.useEffect(() => { + + Messenger.send(DashboardMessage.sendTelemetry, { + event: TelemetryEvent.webviewWelcomeScreen + }); + return () => { Messenger.send(DashboardMessage.reload) }; - }, ['']); + }, []); return (
diff --git a/src/explorerView/ExplorerView.ts b/src/explorerView/ExplorerView.ts index 4a9b4c48..1e8f3650 100644 --- a/src/explorerView/ExplorerView.ts +++ b/src/explorerView/ExplorerView.ts @@ -1,6 +1,6 @@ import { DashboardData } from '../models/DashboardData'; import { Template } from '../commands/Template'; -import { DefaultFields, SETTINGS_CONTENT_FRONTMATTER_HIGHLIGHT, SETTING_AUTO_UPDATE_DATE, SETTING_CUSTOM_SCRIPTS, SETTING_SEO_CONTENT_MIN_LENGTH, SETTING_SEO_DESCRIPTION_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_PREVIEW_HOST, SETTING_DATE_FORMAT, SETTING_COMMA_SEPARATED_FIELDS, SETTING_TAXONOMY_CONTENT_TYPES, SETTING_PANEL_FREEFORM, SETTING_SEO_DESCRIPTION_LENGTH, SETTING_SEO_TITLE_LENGTH, SETTING_SLUG_PREFIX, SETTING_SLUG_SUFFIX, SETTING_TAXONOMY_CATEGORIES, SETTING_TAXONOMY_TAGS, SETTINGS_CONTENT_DRAFT_FIELD, SETTING_SEO_SLUG_LENGTH, SETTING_SITE_BASEURL, SETTING_TAXONOMY_CUSTOM, CONTEXT, SETTINGS_FRAMEWORK_ID, SETTINGS_FRAMEWORK_START } from '../constants'; +import { DefaultFields, SETTINGS_CONTENT_FRONTMATTER_HIGHLIGHT, SETTING_AUTO_UPDATE_DATE, SETTING_CUSTOM_SCRIPTS, SETTING_SEO_CONTENT_MIN_LENGTH, SETTING_SEO_DESCRIPTION_FIELD, SETTING_SLUG_UPDATE_FILE_NAME, SETTING_PREVIEW_HOST, SETTING_DATE_FORMAT, SETTING_COMMA_SEPARATED_FIELDS, SETTING_TAXONOMY_CONTENT_TYPES, SETTING_PANEL_FREEFORM, SETTING_SEO_DESCRIPTION_LENGTH, SETTING_SEO_TITLE_LENGTH, SETTING_SLUG_PREFIX, SETTING_SLUG_SUFFIX, SETTING_TAXONOMY_CATEGORIES, SETTING_TAXONOMY_TAGS, SETTINGS_CONTENT_DRAFT_FIELD, SETTING_SEO_SLUG_LENGTH, SETTING_SITE_BASEURL, SETTING_TAXONOMY_CUSTOM, CONTEXT, SETTINGS_FRAMEWORK_ID, SETTINGS_FRAMEWORK_START, TelemetryEvent } from '../constants'; import * as os from 'os'; import { PanelSettings, CustomScript as ICustomScript } from '../models/PanelSettings'; import { CancellationToken, Disposable, Uri, Webview, WebviewView, WebviewViewProvider, WebviewViewResolveContext, window, workspace, commands, env as vscodeEnv, ThemeIcon } from "vscode"; @@ -23,7 +23,7 @@ import { Dashboard } from '../commands/Dashboard'; import { ImageHelper } from '../helpers/ImageHelper'; import { CustomScript } from '../helpers/CustomScript'; import { Link, Parent } from 'mdast-util-from-markdown/lib'; -import { Telemetry, TelemetryEvent } from '../helpers/Telemetry'; +import { Telemetry } from '../helpers/Telemetry'; const FILE_LIMIT = 10; diff --git a/src/extension.ts b/src/extension.ts index c38f1beb..0381b7af 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1,4 +1,4 @@ -import { Telemetry, TelemetryEvent } from './helpers/Telemetry'; +import { Telemetry } from './helpers/Telemetry'; import { ContentType } from './helpers/ContentType'; import { Dashboard } from './commands/Dashboard'; import * as vscode from 'vscode'; @@ -7,7 +7,7 @@ import { Folders } from './commands/Folders'; import { Preview } from './commands/Preview'; import { Project } from './commands/Project'; import { Template } from './commands/Template'; -import { COMMAND_NAME } from './constants'; +import { COMMAND_NAME, TelemetryEvent } from './constants'; import { TaxonomyType } from './models'; import { MarkdownFoldingProvider } from './providers/MarkdownFoldingProvider'; import { TagType } from './panelWebView/TagType'; diff --git a/src/helpers/ContentType.ts b/src/helpers/ContentType.ts index e240b946..6fbfd6ee 100644 --- a/src/helpers/ContentType.ts +++ b/src/helpers/ContentType.ts @@ -1,14 +1,14 @@ import { PagesListener } from './../listeners/PagesListener'; import { ArticleHelper, Settings } from "."; -import { SETTINGS_CONTENT_DRAFT_FIELD, SETTING_TAXONOMY_CONTENT_TYPES } from "../constants"; +import { SETTINGS_CONTENT_DRAFT_FIELD, SETTING_TAXONOMY_CONTENT_TYPES, TelemetryEvent } from "../constants"; import { ContentType as IContentType, DraftField, Field } from '../models'; -import { Uri, workspace, window, commands } from 'vscode'; +import { Uri, commands } from 'vscode'; import { Folders } from "../commands/Folders"; import { Questions } from "./Questions"; import { writeFileSync } from "fs"; import { Notifications } from "./Notifications"; import { DEFAULT_CONTENT_TYPE_NAME } from "../constants/ContentType"; -import { Telemetry, TelemetryEvent } from './Telemetry'; +import { Telemetry } from './Telemetry'; export class ContentType { diff --git a/src/helpers/SettingsHelper.ts b/src/helpers/SettingsHelper.ts index 56a0284f..f3902211 100644 --- a/src/helpers/SettingsHelper.ts +++ b/src/helpers/SettingsHelper.ts @@ -1,9 +1,9 @@ -import { Telemetry, TelemetryEvent } from './Telemetry'; +import { Telemetry } from './Telemetry'; import { Notifications } from './Notifications'; import { commands, Uri, workspace, window } from 'vscode'; import * as vscode from 'vscode'; import { ContentType, CustomTaxonomy, TaxonomyType } from '../models'; -import { SETTING_TAXONOMY_TAGS, SETTING_TAXONOMY_CATEGORIES, CONFIG_KEY, CONTEXT, ExtensionState, SETTING_TAXONOMY_CUSTOM } from '../constants'; +import { SETTING_TAXONOMY_TAGS, SETTING_TAXONOMY_CATEGORIES, CONFIG_KEY, CONTEXT, ExtensionState, SETTING_TAXONOMY_CUSTOM, TelemetryEvent } from '../constants'; import { Folders } from '../commands/Folders'; import { join, basename } from 'path'; import { existsSync, readFileSync, watch, writeFileSync } from 'fs'; diff --git a/src/helpers/Telemetry.ts b/src/helpers/Telemetry.ts index 88ad5099..4c45b9cd 100644 --- a/src/helpers/Telemetry.ts +++ b/src/helpers/Telemetry.ts @@ -2,29 +2,6 @@ import TelemetryReporter, { TelemetryEventMeasurements, TelemetryEventProperties import { Extension } from '.'; import { EXTENSION_BETA_ID, EXTENSION_ID } from '../constants'; -export const TelemetryEvent = { - activate: 'activate', - initialization: 'initialization', - openContentDashboard: 'openContentDashboard', - openMediaDashboard: 'openMediaDashboard', - openDataDashboard: 'openDataDashboard', - closeDashboard: 'closeDashboard', - generateSlug: 'generateSlug', - createContentFromTemplate: 'createContentFromTemplate', - createContentFromContentType: 'createContentFromContentType', - registerFolder: 'registerFolder', - unregisterFolder: 'unregisterFolder', - addMediaFolder: 'addMediaFolder', - promoteSettings: 'promoteSettings', - openPreview: 'openPreview', - uploadMedia: 'uploadMedia', - refreshMedia: 'refreshMedia', - deleteMedia: 'deleteMedia', - insertMediaToContent: 'insertMediaToContent', - updateMediaMetadata: 'updateMediaMetadata', - openExplorerView: 'openExplorerView', -}; - export class Telemetry { private static instance: Telemetry; private static reporter: TelemetryReporter | null = null; diff --git a/src/listeners/MediaListener.ts b/src/listeners/MediaListener.ts index 1d33db21..42874088 100644 --- a/src/listeners/MediaListener.ts +++ b/src/listeners/MediaListener.ts @@ -1,11 +1,11 @@ -import { Telemetry, TelemetryEvent } from './../helpers/Telemetry'; +import { Telemetry } from './../helpers/Telemetry'; import { MediaHelpers } from './../helpers/MediaHelpers'; import { DashboardMessage } from "../dashboardWebView/DashboardMessage"; import { BaseListener } from "./BaseListener"; import { DashboardCommand } from '../dashboardWebView/DashboardCommand'; import { SortingOption } from '../dashboardWebView/models'; import { commands, env, Uri } from 'vscode'; -import { COMMAND_NAME } from '../constants'; +import { COMMAND_NAME, TelemetryEvent } from '../constants'; import * as os from 'os'; diff --git a/src/listeners/TelemetryListener.ts b/src/listeners/TelemetryListener.ts new file mode 100644 index 00000000..c603d16a --- /dev/null +++ b/src/listeners/TelemetryListener.ts @@ -0,0 +1,21 @@ +import { DashboardMessage } from "../dashboardWebView/DashboardMessage"; +import { Telemetry } from "../helpers/Telemetry"; +import { BaseListener } from "./BaseListener"; + + +export class TelemetryListener extends BaseListener { + + /** + * Process the messages for the dashboard views + * @param msg + */ + public static process(msg: { command: DashboardMessage, data: any }) { + super.process(msg); + + switch(msg.command) { + case DashboardMessage.sendTelemetry: + Telemetry.send(msg.data.event, msg.data.properties, msg.data.metrics); + break; + } + } +} \ No newline at end of file diff --git a/src/listeners/index.ts b/src/listeners/index.ts index a1799860..6a61ba18 100644 --- a/src/listeners/index.ts +++ b/src/listeners/index.ts @@ -1,5 +1,8 @@ +export * from './BaseListener'; export * from './DashboardListener'; +export * from './DataListener'; export * from './ExtensionListener'; export * from './MediaListener'; export * from './PagesListener'; export * from './SettingsListener'; +export * from './TelemetryListener'; diff --git a/webpack/extension.config.js b/webpack/extension.config.js index 80b7b250..6fa06a1b 100644 --- a/webpack/extension.config.js +++ b/webpack/extension.config.js @@ -18,7 +18,8 @@ const config = [ }, devtool: 'nosources-source-map', externals: { - vscode: 'commonjs vscode' + vscode: 'commonjs vscode', + 'applicationinsights-native-metrics': 'commonjs applicationinsights-native-metrics' }, resolve: { extensions: ['.ts', '.js']