From 8b88f82be922036ac8cdb44cb8042d5534454350 Mon Sep 17 00:00:00 2001
From: Daniel Kurowski <daniel.kurowski@grifart.cz>
Date: Mon, 7 Nov 2022 15:48:08 +0100
Subject: [PATCH] pass context to getter, not to VO constructor

---
 src/HashTarget.ts                             | 21 +++++++++----------
 .../initializeOnLinkClickScroll.ts            |  2 +-
 .../loadScroll/initializeOnLoadScroll.ts      |  2 +-
 src/scrollers/scrollToTarget.ts               |  4 ++--
 4 files changed, 14 insertions(+), 15 deletions(-)

diff --git a/src/HashTarget.ts b/src/HashTarget.ts
index 46dc695..b21ff12 100644
--- a/src/HashTarget.ts
+++ b/src/HashTarget.ts
@@ -5,22 +5,15 @@ export class HashTarget
 {
 	private constructor(
 		private readonly value: string,
-		private readonly targetElement: HTMLElement,
 	) {}
 
-	public static fromString(value: string, document: HTMLDocument): HashTarget
+	public static fromString(value: string): HashTarget
 	{
 		if (value === '' || value === '#') {
 			throw new Error('Hash does not contain any fragment.');
 		}
 
-		const targetElementId = value.substring(1);
-		const targetElement = document.getElementById(targetElementId);
-		if (targetElement === null) {
-			throw new Error(`No referenced element with ID ${targetElementId} exists.`);
-		}
-
-		return new this(value, targetElement);
+		return new this(value);
 	}
 
 	public getHash(): string
@@ -28,8 +21,14 @@ export class HashTarget
 		return this.value;
 	}
 
-	public getElement(): HTMLElement
+	public getRefElement(document: HTMLDocument): HTMLElement
 	{
-		return this.targetElement;
+		const targetElementId = this.value.substring(1);
+		const targetElement = document.getElementById(targetElementId);
+		if (targetElement === null) {
+			throw new Error(`No referenced element with ID ${targetElementId} exists.`);
+		}
+
+		return targetElement;
 	}
 }
diff --git a/src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts b/src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts
index 49d2cfd..31806d4 100644
--- a/src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts
+++ b/src/handlers/linkClickScroll/initializeOnLinkClickScroll.ts
@@ -15,6 +15,6 @@ export function initializeOnLinkClickScroll(): void
 				}
 
 				event.preventDefault();
-				scrollToTarget(HashTarget.fromString(element.hash, document));
+				scrollToTarget(HashTarget.fromString(element.hash));
 			})));
 }
diff --git a/src/handlers/loadScroll/initializeOnLoadScroll.ts b/src/handlers/loadScroll/initializeOnLoadScroll.ts
index 335d65d..b4a42ce 100644
--- a/src/handlers/loadScroll/initializeOnLoadScroll.ts
+++ b/src/handlers/loadScroll/initializeOnLoadScroll.ts
@@ -22,7 +22,7 @@ export function initializeOnLoadScroll(): void
 
 	document.addEventListener('DOMContentLoaded', () => {
 		try {
-			hashTarget = HashTarget.fromString(hash, document);
+			hashTarget = HashTarget.fromString(hash);
 		} catch (e) {} // when URL contains hash which has no corresponding DOM element, just ignore it
 	});
 
diff --git a/src/scrollers/scrollToTarget.ts b/src/scrollers/scrollToTarget.ts
index a31ec01..5906c2b 100644
--- a/src/scrollers/scrollToTarget.ts
+++ b/src/scrollers/scrollToTarget.ts
@@ -5,11 +5,11 @@ import {assert} from '../assert';
 export function scrollToTarget(hashTarget: HashTarget|string, onScrollFinishedCallback?: () => void): void
 {
 	if (typeof hashTarget === 'string') {
-		hashTarget = HashTarget.fromString(hashTarget, document);
+		hashTarget = HashTarget.fromString(hashTarget);
 	}
 
 	scrollToElement(
-		hashTarget.getElement(),
+		hashTarget.getRefElement(document),
 		() => {
 			assert(hashTarget instanceof HashTarget);
 			window.location.hash = hashTarget.getHash();
-- 
GitLab