diff --git a/JavaScript/Tasks/1-angular.mjs b/JavaScript/Tasks/1-angular.mjs index 6ef9707..b6732db 100644 --- a/JavaScript/Tasks/1-angular.mjs +++ b/JavaScript/Tasks/1-angular.mjs @@ -14,13 +14,9 @@ const electronics = [ const items = signal(electronics); -const total = (items) => { - let result = 0; - for (const item of items) { - result += item.price; - } - return result; -}; +const total = computed(() => + items().reduce((sum, item) => sum + item.price, 0) +); -console.log(`Total: ${total(items())}`); -console.log(computed); +console.log(`Total: ${total()}`); +console.log(computed); \ No newline at end of file diff --git a/JavaScript/Tasks/2-preact.js b/JavaScript/Tasks/2-preact.js index f1abd2d..d33e960 100644 --- a/JavaScript/Tasks/2-preact.js +++ b/JavaScript/Tasks/2-preact.js @@ -14,13 +14,9 @@ const electronics = [ const items = signal(electronics); -const total = (items) => { - let result = 0; - for (const item of items) { - result += item.price; - } - return result; -}; +const total = computed(() => + items.value.reduce((sum, item) => sum + item.price, 0) +); -console.log(`Total: ${total(items.value)}`); +console.log(`Total: ${total.value}`); console.log(computed); diff --git a/JavaScript/Tasks/3-effect.js b/JavaScript/Tasks/3-effect.js index 1ad3f1f..bfc8438 100644 --- a/JavaScript/Tasks/3-effect.js +++ b/JavaScript/Tasks/3-effect.js @@ -15,7 +15,36 @@ const electronics = [ const total = signal(0); +const items = signal([...electronics]); + effect(() => { - console.log(electronics); - console.log({ total }); + let sum = 0; + for (const item of items.value) { + sum += item.price; + } + + total.value = sum; + + console.log('Current state'); + console.log('Items:', items.value); + console.log('Total:', total.value); }); + +console.log('\nInitial state:'); + +setTimeout(() => { + console.log('\nAdding a new item'); + items.value = [...items.value, { name: 'Mouse', price: 50 }]; +}, 1000); + +setTimeout(() => { + console.log('\nRemoving an item'); + items.value = items.value.filter(item => item.name !== 'Keyboard'); +}, 2000); + +setTimeout(() => { + console.log('\nUpdating item price'); + items.value = items.value.map(item => + item.name === 'Laptop' ? {...item, price: 1600} : item + ); +}, 3000); \ No newline at end of file diff --git a/JavaScript/Tasks/4-dispose.js b/JavaScript/Tasks/4-dispose.js index 8069cf5..aac19e4 100644 --- a/JavaScript/Tasks/4-dispose.js +++ b/JavaScript/Tasks/4-dispose.js @@ -18,9 +18,53 @@ const electronics = [ ]; const total = signal(0); +const items = signal([...electronics]); -effect(() => { - console.log(electronics); - console.log({ total }); - console.log({ PURCHASE_LIMIT }); +let disposeEffect = null; + +function addRandomItem() { + const randomItems = [ + { name: 'Mouse', price: 50 }, + { name: 'Monitor', price: 200 }, + { name: 'Headphones', price: 80 }, + { name: 'USB Cable', price: 15 } + ]; + + const randomItem = randomItems[Math.floor(Math.random() * randomItems.length)]; + items.value = [...items.value, randomItem]; + return randomItem; +} + +disposeEffect = effect(() => { + total.value = items.value.reduce((sum, item) => sum + item.price, 0); + + if (total.value <= PURCHASE_LIMIT) { + console.log('Current purchase'); + console.log('Items:', items.value.map(i => `${i.name}: $${i.price}`).join(', ')); + console.log(`Total: $${total.value} (Limit: $${PURCHASE_LIMIT})`); + } }); + +const interval = setInterval(() => { + if (total.value > PURCHASE_LIMIT * 2) { + clearInterval(interval); + if (disposeEffect) disposeEffect(); + console.log(`Final total: $${total.value} (Process stopped)`); + return; + } + + const newItem = addRandomItem(); + console.log(`Added: ${newItem.name} for $${newItem.price}`); + + if (total.value > PURCHASE_LIMIT && disposeEffect) { + console.log(`\n Limit exceeded ($${total.value} > $${PURCHASE_LIMIT}), stopping output\n`); + disposeEffect(); + disposeEffect = null; + } +}, 1000); + +setTimeout(() => { + if (interval) clearInterval(interval); + if (disposeEffect) disposeEffect(); + console.log(`Final total: $${total.value} (Timeout reached)`); +}, 10000); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..aa247d9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,60 @@ +{ + "name": "Signals", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "dependencies": { + "@angular/core": "^20.0.3", + "@preact/signals-core": "^1.10.0" + } + }, + "node_modules/@angular/core": { + "version": "20.0.3", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-20.0.3.tgz", + "integrity": "sha512-kB6w1bQgClfmkTbWJeD3vSLqX0e3uSaJD6KJ7XXT1IEaqUs4J+mKRKHQyxpJlpdUb7R+jDaHSM/vrVF15/L2rA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" + }, + "peerDependencies": { + "@angular/compiler": "20.0.3", + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.15.0" + }, + "peerDependenciesMeta": { + "@angular/compiler": { + "optional": true + }, + "zone.js": { + "optional": true + } + } + }, + "node_modules/@preact/signals-core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@preact/signals-core/-/signals-core-1.10.0.tgz", + "integrity": "sha512-qlKeXlfqtlC+sjxCPHt6Sk0/dXBrKZVcPlianqjNc/vW263YBFiP5mRrgKpHoO0q222Thm1TdYQWfCKpbbgvwA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "peer": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..6a9d826 --- /dev/null +++ b/package.json @@ -0,0 +1,6 @@ +{ + "dependencies": { + "@angular/core": "^20.0.3", + "@preact/signals-core": "^1.10.0" + } +}