diff --git a/LICENSE b/LICENSE index a31dfcd..53b066d 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 DevVali +Copyright (c) 2024 DevVali Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 93f51b5..c5ebb8c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Xmas Time (╯^□^)❄☃❄ +# Xmas Time (╯^□^)❄☃❄: Season 2! ![Xmas Time](images/hero.png) diff --git a/package-lock.json b/package-lock.json index 477b1b5..c526ab8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,15 +1,12 @@ { "name": "xmas-time", - "version": "1.1.0", + "version": "1.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "xmas-time", - "version": "1.1.0", - "dependencies": { - "dayjs": "^1.11.10" - }, + "version": "1.1.2", "devDependencies": { "@types/mocha": "^10.0.3", "@types/node": "18.x", @@ -990,11 +987,6 @@ "node": ">= 8" } }, - "node_modules/dayjs": { - "version": "1.11.10", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", - "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" - }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", diff --git a/package.json b/package.json index 8aa5a54..ec20e63 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,9 @@ "Christmas countdown", "Christmas Day countdown", "Christmas countdown 2023", + "Christmas countdown 2024", + "Christmas countdown 2025", + "Christmas countdown 2026", "Festival countdown", "Status bar", "Time left until Christmas", @@ -63,14 +66,11 @@ "properties": { "xmasTime.yourXmas": { "title": "Your Xmas", - "description": "Personalize your Xmas experience by specifying the day you celebrate. The countdown adapts to your festive schedule.", + "description": "Personalize your Xmas experience by specifying the day you celebrate. The countdown adapts to your festive schedule. Enter the date in YYYY-MM-DD format.", "type": "string", - "enum": [ - "2023-12-24", - "2023-12-25", - "2024-01-06" - ], - "default": "2023-12-25" + "default": "2024-12-25", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$", + "patternErrorMessage": "The given date must be in the YYYY-MM-DD format." } } } @@ -98,6 +98,5 @@ "webpack-cli": "^5.1.4" }, "dependencies": { - "dayjs": "^1.11.10" } } diff --git a/src/dateDifference.js b/src/dateDifference.js new file mode 100644 index 0000000..f611f61 --- /dev/null +++ b/src/dateDifference.js @@ -0,0 +1,15 @@ +function dateDifference(dateA, dateB) { + const differenceMS = dateB - dateA; + console.log(differenceMS); + const days = Math.trunc(differenceMS / 86400000); + const hours = Math.trunc((differenceMS % 86400000) / 3600000); + const minutes = Math.trunc(((differenceMS % 86400000) % 3600000 ) / 60000); + + return { + days: days, + hours: hours, + minutes: minutes + } +} + +export default dateDifference; \ No newline at end of file diff --git a/src/extension.js b/src/extension.js index e1b34d9..1796aa9 100644 --- a/src/extension.js +++ b/src/extension.js @@ -1,9 +1,16 @@ const vscode = require('vscode'); const { createStatusBar, updateStatusBar } = require('./statusBar'); +/** @type {vscode.Disposable} */ let disposable; + +/** @type {vscode.Disposable[]} */ let subscriptions = []; +/** + * @function + * @returns {void} + */ function activate() { disposable = vscode.commands.registerCommand('xmasTime.run', function () { updateStatusBar(); @@ -29,12 +36,23 @@ function activate() { updateStatusBar(); } +/** + * @function + * @returns {void} + */ function deactivate() { // Disposing disposable.dispose(); subscriptions.forEach((subscription) => subscription.dispose()); } +/** + * @exports + * @type {{ + * activate: function(): void, + * deactivate: function(): void + * }} + */ module.exports = { activate, deactivate, diff --git a/src/getTimeLeft.js b/src/getTimeLeft.js index f133a9d..7a8172e 100644 --- a/src/getTimeLeft.js +++ b/src/getTimeLeft.js @@ -1,88 +1,32 @@ -const vscode = require('vscode'); -const dayjs = require('dayjs'); -const { yourXmas } = vscode.workspace.getConfiguration('xmasTime'); - -// Helpers - -function diff(unit) { - return dayjs(yourXmas).diff(dayjs(), unit); -} - -function getUnit() { - let result = ''; +import dateDifference from './dateDifference'; - // Less than 1 ms - if (diff('ms') < 1) { - result = 'celebrating'; - if (diff('d') < -13) { - result = 'over'; - } - } - // Greather than 1 ms - if (diff('ms') > 1) { - result = 'm'; - if (diff('d') > 0) { - result = 'd'; - } else if (diff('h') > 0) { - result = 'h'; - } - } - if (result !== '') { - return result; - } else { - return console.log( - 'Xmas Time could not calculate the time left until Christmas!' - ); - } -} +const vscode = require('vscode'); // Get the time left and return the text - function getTimeLeft() { - const unit = getUnit(); - let timeLeft = diff(unit); - let result = ''; - - switch (unit) { - case 'm': - timeLeft += 1; - result = `${timeLeft} ${timeLeft > 1 ? 'minutes' : 'minute'}`; - break; - case 'd': - const hoursLeft = diff('h') % 24; - if (hoursLeft > 0) { - result = `${timeLeft} ${ - timeLeft > 1 ? 'days' : 'day' - } and ${hoursLeft} ${hoursLeft > 1 ? 'hours' : 'hour'}`; - } else { - result = `${timeLeft} ${timeLeft > 1 ? 'days' : 'day'}`; - } - break; - case 'h': - const minutesLeft = (diff('m') % 60) + 1; - if (minutesLeft > 0 && minutesLeft !== 60) { - result = `${timeLeft} ${ - timeLeft > 1 ? 'hours' : 'hour' - } and ${minutesLeft} ${minutesLeft > 1 ? 'minutes' : 'minute'}`; - } else { - timeLeft += 1; - result = `${timeLeft} ${timeLeft > 1 ? 'hours' : 'hour'}`; - } - break; - case 'celebrating': - result = 'Merry Christmas!'; - break; - case 'over': - result = 'Christmas is over!'; - break; + const { yourXmas } = vscode.workspace.getConfiguration('xmasTime'); + const difference = dateDifference(Date.now(), Date.parse(yourXmas)); + + if (difference.minutes < 0 && difference.days == 0) { // 60 * 24 minutes per day + // it is the christmas day + return "Merry Christmas!"; + } else if (difference.days <= -1) { + // christmas is over + return "Christmas is over!"; } - if (result !== '') { - return result; + + if (difference.days > 0) { + // days hours + return `${difference.days} ${difference.days > 1 ? "days" : "day"} and ${difference.hours} ${difference.hours > 1 ? "hours" : "hour"}` } else { - return console.log( - 'Xmas Time could not calculate the time left until Christmas!' - ); + if (difference.hours > 0) { + // hours minutes + return `${difference.hours} ${difference.hours > 1 ? "hours" : "hour"} and ${difference.minutes} ${difference.minutes > 1 ? "minutes" : "minute"}` + } else { + // minutes + return `${difference.minutes} ${difference.minutes > 1 ? "minutes" : "minute"}` + } } } -module.exports = { getTimeLeft }; +export default getTimeLeft; diff --git a/src/statusBar.js b/src/statusBar.js index 23d56f0..7ece8c8 100644 --- a/src/statusBar.js +++ b/src/statusBar.js @@ -1,11 +1,16 @@ +import getTimeLeft from './getTimeLeft.js'; + const vscode = require('vscode'); -const { getTimeLeft } = require('./getTimeLeft'); /** * @type {vscode.StatusBarItem} */ -let statusBar = null; +let statusBar; +/** + * @function + * @returns {vscode.StatusBarItem} + */ function createStatusBar() { statusBar = vscode.window.createStatusBarItem( vscode.StatusBarAlignment.Right @@ -14,6 +19,10 @@ function createStatusBar() { return statusBar; } +/** + * @function + * @returns {void} + */ function updateStatusBar() { if ( getTimeLeft() !== 'Merry Christmas!' && @@ -23,8 +32,16 @@ function updateStatusBar() { statusBar.tooltip = `${getTimeLeft()} left until Christmas 🎄`; } else { statusBar.text = `$(sparkle) ${getTimeLeft()}`; + statusBar.tooltip = null; } statusBar.show(); } -module.exports = { createStatusBar, updateStatusBar }; +/** + * @exports + * @type {{ + * createStatusBar: function(): vscode.StatusBarItem, + * updateStatusBar: function(): void + * }} + */ +export { createStatusBar, updateStatusBar };