Skip to content

Instantly share code, notes, and snippets.

@adriangalilea
Created February 19, 2024 08:35
Show Gist options
  • Save adriangalilea/4862f9547a264b7d4d80e70761042519 to your computer and use it in GitHub Desktop.
Save adriangalilea/4862f9547a264b7d4d80e70761042519 to your computer and use it in GitHub Desktop.
just testing force touch in a next.js project. Not very useful as I can not make the touchpad vibrate which was my main purpose but still cool to be able to monitor the pressure precisely(only from safari))
"use client";
import React, { useRef, useEffect } from "react";
// Define the extended MouseEvent interface to include the webkitForce property
interface ForceMouseEvent extends MouseEvent {
webkitForce?: number;
}
export default function ForceTouchComponent() {
const ref = useRef<HTMLDivElement>(null);
useEffect(() => {
const element = ref.current;
if (!element) return;
// Define the event handler functions with the correct type
const handleEvent = (event: ForceMouseEvent) => {
console.log(event.type, event.webkitForce);
};
// Use a generic approach to add event listeners
const addForceEventListener = (
type: string,
listener: (this: HTMLDivElement, ev: ForceMouseEvent) => any,
) => {
element.addEventListener(type, listener as EventListener);
};
// Add event listeners for Force Touch events
addForceEventListener("webkitmouseforcewillbegin", handleEvent);
addForceEventListener("webkitmouseforcedown", handleEvent);
addForceEventListener("webkitmouseforceup", handleEvent);
addForceEventListener("webkitmouseforcechanged", handleEvent);
// Cleanup function to remove event listeners
return () => {
element.removeEventListener(
"webkitmouseforcewillbegin",
handleEvent as EventListener,
);
element.removeEventListener(
"webkitmouseforcedown",
handleEvent as EventListener,
);
element.removeEventListener(
"webkitmouseforceup",
handleEvent as EventListener,
);
element.removeEventListener(
"webkitmouseforcechanged",
handleEvent as EventListener,
);
};
}, []);
return (
<div
ref={ref}
style={{ width: "100%", height: "100vh", background: "#eee" }}
>
Force Touch Area
</div>
);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment