From 6f009d6f7b1ffec32366d077c3904089b6f20203 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Mon, 19 Jul 2021 21:42:59 +0300 Subject: [PATCH 1/7] Fix imports --- src/screens/dashboard/components/HoursWithDuration.tsx | 2 +- src/screens/hours/components/HoursCard/HoursCard.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/screens/dashboard/components/HoursWithDuration.tsx b/src/screens/dashboard/components/HoursWithDuration.tsx index 1760d44..2c7aa2e 100644 --- a/src/screens/dashboard/components/HoursWithDuration.tsx +++ b/src/screens/dashboard/components/HoursWithDuration.tsx @@ -2,7 +2,7 @@ import React from 'react'; import { Card } from 'antd'; import { createUseStyles } from 'react-jss'; -import TaskWithDurationModel from '../../../models/TaskWithDurationModel'; +import TaskWithDurationModel from '../../../modules/tasks/models/TaskWithDurationModel'; import { msToTime } from '../../../helpers/DateTime'; interface IHoursWithDurationProps { diff --git a/src/screens/hours/components/HoursCard/HoursCard.tsx b/src/screens/hours/components/HoursCard/HoursCard.tsx index d464a3e..d5c9f54 100644 --- a/src/screens/hours/components/HoursCard/HoursCard.tsx +++ b/src/screens/hours/components/HoursCard/HoursCard.tsx @@ -4,7 +4,7 @@ import format from 'date-fns/format'; import { observer } from 'mobx-react'; import { createUseStyles } from 'react-jss'; -import TaskTimeItemModel from '../../../../models/TaskTimeItemModel'; +import TaskTimeItemModel from '../../../../modules/tasks/models/TaskTimeItemModel'; import PlayStopButton from '../../../../components/PlayStopButton/PlayStopButton'; import rootStore from '../../../../modules/RootStore'; import { msToTime } from '../../../../helpers/DateTime'; From 09f07d40714a2647fb4c8b27a7d87b5b5ee19ba0 Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Mon, 19 Jul 2021 21:52:16 +0300 Subject: [PATCH 2/7] Fix duration display --- .../repositories/AbstractFileRepository.ts | 5 ++++- src/hooks/TaskHooks.ts | 19 +++++++++++-------- .../DrawerTask/components/Duration.tsx | 2 +- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/src/base/repositories/AbstractFileRepository.ts b/src/base/repositories/AbstractFileRepository.ts index c38ee47..43787c9 100644 --- a/src/base/repositories/AbstractFileRepository.ts +++ b/src/base/repositories/AbstractFileRepository.ts @@ -4,7 +4,10 @@ const path = require('path'); import FsHelper from '../../helpers/FsHelper'; import PromiseQueue from '../../helpers/PromiseQueueHellper'; -const APP_DIR = 'YadroTimeTracker'; +const APP_DIR = + process.env.NODE_ENV === 'development' + ? 'YadroTimeTracker_test' + : 'YadroTimeTracker'; export default abstract class AbstractFileRepository { dirWithProfileData: string = 'profile1'; diff --git a/src/hooks/TaskHooks.ts b/src/hooks/TaskHooks.ts index ae4b3f0..f527bc6 100644 --- a/src/hooks/TaskHooks.ts +++ b/src/hooks/TaskHooks.ts @@ -5,7 +5,7 @@ import { calcDuration, calcDurationGaps, msToTime } from '../helpers/DateTime'; import TaskModel, { ITimeRangeModel } from '../modules/tasks/models/TaskModel'; import TaskTimeItemModel from '../modules/tasks/models/TaskTimeItemModel'; -export function useTaskDuration(model: TaskModel | undefined) { +export function useTaskDuration(model?: TaskModel, showZero?: boolean) { const intervalRef = useRef(); const [duration, setDuration] = useState(''); @@ -14,9 +14,12 @@ export function useTaskDuration(model: TaskModel | undefined) { return; } const duration = model.duration; - if (duration !== 0) { - setDuration(msToTime(duration, model.active)); - } + + const durationMs = + duration !== 0 || showZero ? msToTime(duration, model.active) : ''; + + setDuration(durationMs); + if (model.active) { intervalRef.current = setInterval(() => { setDuration(msToTime(model?.duration || 0)); @@ -39,12 +42,12 @@ export function useTimeItemsDuration(taskTime: TaskTimeItemModel[]) { const calcTaskDuration = useCallback( () => calcDuration(taskTime.map((t) => t.time)), - [taskTime], + [taskTime] ); const calcTaskGapsDuration = useCallback( () => calcDurationGaps(taskTime.map((t) => t.time)), - [taskTime], + [taskTime] ); const setTimes = useCallback(() => { @@ -78,7 +81,7 @@ export function useTimeRangeDuration(timeRange: ITimeRangeModel | undefined) { const calcTimeRangeDuration = useCallback( () => msToTime(timeRange ? calcDuration([timeRange]) : 0), - [timeRange], + [timeRange] ); useEffect(() => { @@ -104,7 +107,7 @@ export function useTimeRangeDuration(timeRange: ITimeRangeModel | undefined) { } export function useStartWorkingTime( - timeItems: TaskTimeItemModel[], + timeItems: TaskTimeItemModel[] ): Date | undefined { return useMemo(() => { let minTime: Date | undefined; diff --git a/src/screens/projects/components/DrawerTask/components/Duration.tsx b/src/screens/projects/components/DrawerTask/components/Duration.tsx index 5c7225e..fc1e678 100644 --- a/src/screens/projects/components/DrawerTask/components/Duration.tsx +++ b/src/screens/projects/components/DrawerTask/components/Duration.tsx @@ -14,7 +14,7 @@ interface DurationProps { export default observer(function Duration({ task }: DurationProps) { const classes = useStyle(); - const duration = TaskHooks.useTaskDuration(task); + const duration = TaskHooks.useTaskDuration(task, true); return (
From 7e466dba59e58a4ccf17c4814ded5937a322be1e Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Mon, 19 Jul 2021 22:10:07 +0300 Subject: [PATCH 3/7] Stop timer on delete time range --- src/modules/tasks/TaskStore.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/modules/tasks/TaskStore.ts b/src/modules/tasks/TaskStore.ts index 0d04492..73ce01e 100644 --- a/src/modules/tasks/TaskStore.ts +++ b/src/modules/tasks/TaskStore.ts @@ -41,9 +41,10 @@ export default class TaskStore { } deleteTime(task: TaskModel, timeIndex: number) { - if (!task.time[timeIndex].end) { - task.stop(); + if (task.active) { + this.stopTimer(); } + task.time.splice(timeIndex, 1); this.tasksService.save(this.tasks); GaService.event(EEventCategory.TimeRange, ETimeRangeEvents.Delete); From 8da727fb3b5784427e3096c2581702b60293234a Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Tue, 20 Jul 2021 11:06:19 +0300 Subject: [PATCH 4/7] Fix GA --- .env.example | 2 +- src/services/gaService/GaService.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 87f2dac..9ff90a7 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ SENTRY_DSN='https://XXXX.ingest.sentry.io/00000000' -GA_UACODE=UA-XXXXXXXXXX +GA_UACODE=UA-XXXXXXXXX-X # DEBUG=universal-analytics # NODE_DEBUG=request # debug requests in analytics diff --git a/src/services/gaService/GaService.ts b/src/services/gaService/GaService.ts index b2d34ca..7b7e95e 100644 --- a/src/services/gaService/GaService.ts +++ b/src/services/gaService/GaService.ts @@ -17,10 +17,10 @@ const executeOnCondition = (fn: () => void) => { const GaService = { pageView(path: string) { - executeOnCondition(analytics?.pageview(path).send()); + executeOnCondition(() => analytics?.pageview(path).send()); }, event(category: string, action: string) { - executeOnCondition(analytics?.event(category, action).send()); + executeOnCondition(() => analytics?.event(category, action).send()); }, }; From 6c2796cb172501af6dcb3a08a8df963f85390f3c Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Tue, 20 Jul 2021 11:06:27 +0300 Subject: [PATCH 5/7] Test --- src/screens/Main.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/screens/Main.tsx b/src/screens/Main.tsx index 1e4426f..d867318 100644 --- a/src/screens/Main.tsx +++ b/src/screens/Main.tsx @@ -40,6 +40,7 @@ const Main = () => { + {process.env.GA_UACODE} From 547ea5e99de3f839700cf396a9ab19f44176c80b Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Tue, 20 Jul 2021 12:32:26 +0300 Subject: [PATCH 6/7] Dotenv load .env in prod --- .erb/configs/webpack.config.renderer.prod.babel.js | 6 ++++++ package.json | 1 + src/base/repositories/AbstractFileRepository.ts | 2 +- src/screens/Main.tsx | 1 - yarn.lock | 14 ++++++++++++++ 5 files changed, 22 insertions(+), 2 deletions(-) diff --git a/.erb/configs/webpack.config.renderer.prod.babel.js b/.erb/configs/webpack.config.renderer.prod.babel.js index edcd3e3..bd4d2d7 100644 --- a/.erb/configs/webpack.config.renderer.prod.babel.js +++ b/.erb/configs/webpack.config.renderer.prod.babel.js @@ -9,6 +9,7 @@ import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; import CssMinimizerPlugin from 'css-minimizer-webpack-plugin'; import { merge } from 'webpack-merge'; import TerserPlugin from 'terser-webpack-plugin'; +import Dotenv from 'dotenv-webpack'; import baseConfig from './webpack.config.base'; import CheckNodeEnv from '../scripts/CheckNodeEnv'; import DeleteSourceMaps from '../scripts/DeleteSourceMaps'; @@ -170,6 +171,11 @@ export default merge(baseConfig, { DEBUG_PROD: false, }), + new Dotenv({ + path: path.join(__dirname, '../../.env'), + systemvars: true, + }), + new MiniCssExtractPlugin({ filename: 'style.css', }), diff --git a/package.json b/package.json index 7313902..dc44694 100644 --- a/package.json +++ b/package.json @@ -157,6 +157,7 @@ "css-loader": "^5.0.1", "css-minimizer-webpack-plugin": "^2.0.0", "detect-port": "^1.3.0", + "dotenv-webpack": "^7.0.3", "electron": "^12.0.2", "electron-builder": "^22.11.1", "electron-devtools-installer": "git+https://github.com/MarshallOfSound/electron-devtools-installer.git", diff --git a/src/base/repositories/AbstractFileRepository.ts b/src/base/repositories/AbstractFileRepository.ts index 43787c9..c170b3f 100644 --- a/src/base/repositories/AbstractFileRepository.ts +++ b/src/base/repositories/AbstractFileRepository.ts @@ -42,7 +42,7 @@ export default abstract class AbstractFileRepository { } public restore(defaultValue: T): T { - console.log(`${this.logPrefix} restore`); + console.log(`${this.logPrefix} restore ${this.filePath}`); if (fs.existsSync(this.filePath)) { const data = fs.readFileSync(this.filePath, { encoding: 'utf-8' }); // TODO handle parse error. Backup file with issues and return defaultValue diff --git a/src/screens/Main.tsx b/src/screens/Main.tsx index d867318..1e4426f 100644 --- a/src/screens/Main.tsx +++ b/src/screens/Main.tsx @@ -40,7 +40,6 @@ const Main = () => { - {process.env.GA_UACODE} diff --git a/yarn.lock b/yarn.lock index f9968cf..9df93c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3931,11 +3931,25 @@ dot-prop@^5.2.0: dependencies: is-obj "^2.0.0" +dotenv-defaults@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dotenv-defaults/-/dotenv-defaults-2.0.2.tgz#6b3ec2e4319aafb70940abda72d3856770ee77ac" + integrity sha512-iOIzovWfsUHU91L5i8bJce3NYK5JXeAwH50Jh6+ARUdLiiGlYWfGw6UkzsYqaXZH/hjE/eCd/PlfM/qqyK0AMg== + dependencies: + dotenv "^8.2.0" + dotenv-expand@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz#3fbaf020bfd794884072ea26b1e9791d45a629f0" integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== +dotenv-webpack@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-7.0.3.tgz#f50ec3c7083a69ec6076e110566720003b7b107b" + integrity sha512-O0O9pOEwrk+n1zzR3T2uuXRlw64QxHSPeNN1GaiNBloQFNaCUL9V8jxSVz4jlXXFP/CIqK8YecWf8BAvsSgMjw== + dependencies: + dotenv-defaults "^2.0.2" + dotenv@10.0.0: version "10.0.0" resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" From 39ad3cb44a552264376751d3516bac6cafcbf5ab Mon Sep 17 00:00:00 2001 From: Dmitry Yadrikhinsky Date: Wed, 21 Jul 2021 21:47:03 +0300 Subject: [PATCH 7/7] Fix dotenv --- .env.example | 4 +++- .erb/configs/webpack.config.main.prod.babel.js | 18 ++++++++++++++---- .../webpack.config.renderer.dev.babel.js | 6 ++++++ .../webpack.config.renderer.dev.dll.babel.js | 6 ++++++ package.json | 1 - src/components/SettingsModal/SettingsModal.tsx | 13 +++++++++++++ src/main.dev.ts | 6 ++---- src/shared/initSentry.ts | 4 ++++ 8 files changed, 48 insertions(+), 10 deletions(-) diff --git a/.env.example b/.env.example index 9ff90a7..5754edb 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,6 @@ SENTRY_DSN='https://XXXX.ingest.sentry.io/00000000' GA_UACODE=UA-XXXXXXXXX-X -# DEBUG=universal-analytics +# DEBUG=universal-analytics # do not use DEBUG, because `debug` package will override this var. + # But dotenv-webpack plugin will replace it by string and parse by Terser will fail. # NODE_DEBUG=request # debug requests in analytics +# DEBUG_PROD=true diff --git a/.erb/configs/webpack.config.main.prod.babel.js b/.erb/configs/webpack.config.main.prod.babel.js index b2d1f9a..94598ba 100644 --- a/.erb/configs/webpack.config.main.prod.babel.js +++ b/.erb/configs/webpack.config.main.prod.babel.js @@ -10,18 +10,23 @@ import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer'; import baseConfig from './webpack.config.base'; import CheckNodeEnv from '../scripts/CheckNodeEnv'; import DeleteSourceMaps from '../scripts/DeleteSourceMaps'; +import Dotenv from 'dotenv-webpack'; CheckNodeEnv('production'); DeleteSourceMaps(); -const devtoolsConfig = process.env.DEBUG_PROD === 'true' ? { - devtool: 'source-map' -} : {}; +const devtoolsConfig = + process.env.DEBUG_PROD === 'true' + ? { + devtool: 'source-map', + } + : {}; export default merge(baseConfig, { ...devtoolsConfig, mode: 'production', + // devtool: 'source-map', target: 'electron-main', @@ -37,7 +42,7 @@ export default merge(baseConfig, { new TerserPlugin({ parallel: true, }), - ] + ], }, plugins: [ @@ -61,6 +66,11 @@ export default merge(baseConfig, { DEBUG_PROD: false, START_MINIMIZED: false, }), + + new Dotenv({ + path: path.join(__dirname, '../../.env'), + systemvars: true, + }), ], /** diff --git a/.erb/configs/webpack.config.renderer.dev.babel.js b/.erb/configs/webpack.config.renderer.dev.babel.js index 5c25284..26ffb9b 100644 --- a/.erb/configs/webpack.config.renderer.dev.babel.js +++ b/.erb/configs/webpack.config.renderer.dev.babel.js @@ -4,6 +4,7 @@ import webpack from 'webpack'; import chalk from 'chalk'; import { merge } from 'webpack-merge'; import { spawn, execSync } from 'child_process'; +import Dotenv from 'dotenv-webpack'; import baseConfig from './webpack.config.base'; import CheckNodeEnv from '../scripts/CheckNodeEnv'; import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin'; @@ -257,6 +258,11 @@ export default merge(baseConfig, { NODE_ENV: 'development', }), + new Dotenv({ + path: path.join(__dirname, '../../.env'), + systemvars: true, + }), + new webpack.LoaderOptionsPlugin({ debug: true, }), diff --git a/.erb/configs/webpack.config.renderer.dev.dll.babel.js b/.erb/configs/webpack.config.renderer.dev.dll.babel.js index 401c022..08fafe8 100644 --- a/.erb/configs/webpack.config.renderer.dev.dll.babel.js +++ b/.erb/configs/webpack.config.renderer.dev.dll.babel.js @@ -5,6 +5,7 @@ import webpack from 'webpack'; import path from 'path'; import { merge } from 'webpack-merge'; +import Dotenv from 'dotenv-webpack'; import baseConfig from './webpack.config.base'; import { dependencies } from '../../package.json'; import CheckNodeEnv from '../scripts/CheckNodeEnv'; @@ -59,6 +60,11 @@ export default merge(baseConfig, { NODE_ENV: 'development', }), + new Dotenv({ + path: path.join(__dirname, '../../.env'), + systemvars: true, + }), + new webpack.LoaderOptionsPlugin({ debug: true, options: { diff --git a/package.json b/package.json index dc44694..7e6b489 100644 --- a/package.json +++ b/package.json @@ -205,7 +205,6 @@ "caniuse-lite": "1.0.30001214", "clsx": "^1.1.1", "date-fns": "2.20.1", - "dotenv": "10.0.0", "electron-debug": "^3.1.0", "electron-log": "^4.2.4", "electron-updater": "^4.3.4", diff --git a/src/components/SettingsModal/SettingsModal.tsx b/src/components/SettingsModal/SettingsModal.tsx index 22c1a1d..108abdd 100644 --- a/src/components/SettingsModal/SettingsModal.tsx +++ b/src/components/SettingsModal/SettingsModal.tsx @@ -1,5 +1,6 @@ import React, { useCallback, useState } from 'react'; import { + Button, Checkbox, Divider, Form, @@ -11,6 +12,7 @@ import { import { CheckboxChangeEvent } from 'antd/lib/checkbox'; import { SaveOutlined } from '@ant-design/icons'; import { observer } from 'mobx-react'; +import * as Sentry from '@sentry/browser'; // eslint-disable-next-line import/named import moment, { Moment } from 'moment'; @@ -117,6 +119,17 @@ const SettingsModal: React.VFC = observer( onChange={handleChangeNotifications} /> + {process.env.DEBUG_PROD === 'true' && ( + + )} ); } diff --git a/src/main.dev.ts b/src/main.dev.ts index c24fab8..2bf7043 100644 --- a/src/main.dev.ts +++ b/src/main.dev.ts @@ -8,20 +8,18 @@ * When running `yarn build` or `yarn build:main`, this file is compiled to * `./src/main.prod.js` using webpack. This gives us some performance wins. */ +import log from 'electron-log'; +Object.assign(console, log.functions); import 'core-js/stable'; import 'regenerator-runtime/runtime'; -import dotenv from 'dotenv'; import path from 'path'; import { app, BrowserWindow, shell } from 'electron'; import { autoUpdater } from 'electron-updater'; -import log from 'electron-log'; import Badge from 'electron-windows-badge'; import MenuBuilder from './menu'; import { initSentry } from './shared/initSentry'; -dotenv.config(); - initSentry(); console.log('Working path:', app.getAppPath()); diff --git a/src/shared/initSentry.ts b/src/shared/initSentry.ts index 40ef121..5324746 100644 --- a/src/shared/initSentry.ts +++ b/src/shared/initSentry.ts @@ -1,3 +1,6 @@ +import log from 'electron-log'; +Object.assign(console, log.functions); + const Sentry = process.type === 'browser' ? require('@sentry/electron/dist/main') @@ -8,5 +11,6 @@ export function initSentry() { Sentry.init({ dsn: process.env.SENTRY_DSN, }); + console.log(`[process.type=${process.type}] Sentry.init succeeded`); } }