From 055bbf7a29a1b94a32bd9a0fd5daa4dc724a1a95 Mon Sep 17 00:00:00 2001 From: Pihkaal Date: Fri, 14 Nov 2025 23:53:42 +0100 Subject: [PATCH] feat(home): use new navigation system --- .../Home/BottomScreen/Buttons/Buttons.vue | 170 ++++++------------ 1 file changed, 52 insertions(+), 118 deletions(-) diff --git a/app/components/Home/BottomScreen/Buttons/Buttons.vue b/app/components/Home/BottomScreen/Buttons/Buttons.vue index c0ac652..169f63b 100644 --- a/app/components/Home/BottomScreen/Buttons/Buttons.vue +++ b/app/components/Home/BottomScreen/Buttons/Buttons.vue @@ -5,151 +5,85 @@ import PictochatButton from "./PictochatButton.vue"; import DownloadPlayButton from "./DownloadPlayButton.vue"; import Selector from "./Selector.vue"; -type ButtonConfig = { - x: number; - y: number; - sx: number; - sy: number; - sw: number; - sh: number; -}; - const BUTTONS_CONFIG = { - game: { x: 33, y: 25, sx: 31, sy: 23, sw: 193, sh: 49 }, - pictochat: { x: 32, y: 72, sx: 31, sy: 71, sw: 97, sh: 49 }, - downloadPlay: { x: 128, y: 72, sx: 127, sy: 71, sw: 97, sh: 49 }, + game: [31, 23, 193, 49], + pictochat: [31, 71, 97, 49], + downloadPlay: [127, 71, 97, 49], } as const satisfies Record; type ButtonType = keyof typeof BUTTONS_CONFIG; -const selectedButton = ref("game"); -const nextBottomButton = ref<"downloadPlay" | "pictochat">("pictochat"); - -const selectorPosition = computed(() => BUTTONS_CONFIG[selectedButton.value]); - const animationPercentage = ref(0); +const { selectedButton, selectorPosition } = useButtonNavigation({ + buttons: BUTTONS_CONFIG, + initialButton: "game", + onButtonClick: (buttonName) => { + gsap.fromTo( + animationPercentage, + { value: 0 }, + { + value: 1, + duration: 0.35, + ease: "none", + onComplete: () => { + if (buttonName === "pictochat") { + navigateTo("/contact"); + } else { + throw new Error(`Not implemented: ${buttonName}`); + } + }, + }, + ); + }, + navigation: { + game: { + down: "last", + left: "pictochat", + right: "downloadPlay", + horizontalMode: "preview", + }, + pictochat: { + up: "game", + right: "downloadPlay", + }, + downloadPlay: { + up: "game", + left: "pictochat", + }, + }, +}); + const getButtonOffset = (button: ButtonType) => { if (selectedButton.value === button) return animationPercentage.value * -200; return 0; }; const getOpacity = () => (1 - animationPercentage.value) * 100; - -useScreenClick((x: number, y: number) => { - if (animationPercentage.value != 0) return; - - for (const [buttonName, config] of Object.entries(BUTTONS_CONFIG) as [ - ButtonType, - ButtonConfig, - ][]) { - if ( - x >= config.sx && - x <= config.sx + config.sw && - y >= config.sy && - y <= config.sy + config.sh - ) { - if (selectedButton.value === buttonName) { - gsap.fromTo( - animationPercentage, - { value: 0 }, - { - value: 1, - duration: 0.35, - ease: "none", - onComplete: () => { - throw new Error("not implemented: onComplete in button click"); - }, - }, - ); - } else { - selectedButton.value = buttonName; - } - - if (buttonName === "pictochat" || buttonName === "downloadPlay") { - nextBottomButton.value = buttonName; - } - break; - } - } -}); - -const handleKeyPress = (event: KeyboardEvent) => { - switch (event.key) { - case "ArrowUp": - event.preventDefault(); - if ( - selectedButton.value === "downloadPlay" || - selectedButton.value === "pictochat" - ) { - selectedButton.value = "game"; - } - break; - - case "ArrowDown": - event.preventDefault(); - if (selectedButton.value === "game") { - selectedButton.value = nextBottomButton.value; - } - break; - - case "ArrowRight": - event.preventDefault(); - if (selectedButton.value === "game") { - nextBottomButton.value = "downloadPlay"; - } else if (selectedButton.value === "pictochat") { - nextBottomButton.value = "downloadPlay"; - selectedButton.value = "downloadPlay"; - } - break; - - case "ArrowLeft": - event.preventDefault(); - if (selectedButton.value === "game") { - nextBottomButton.value = "pictochat"; - } else if (selectedButton.value === "downloadPlay") { - nextBottomButton.value = "pictochat"; - selectedButton.value = "pictochat"; - } - break; - - case "Enter": - case " ": - throw "Not implemented"; - } -}; - -onMounted(() => { - window.addEventListener("keydown", handleKeyPress); -}); - -onUnmounted(() => { - window.removeEventListener("keydown", handleKeyPress); -});