chore: [Idle detection] Deal with users on systems that don't handle emoji (#2941)
* Deal with users on systems that don't handle emoji
* Leave no trailing space
* Move function to utils, and actually call it 🤣
Chapeau, TypeScript!
* Use grinning face instead of koala
* Tweak globalAlpha
This commit is contained in:
parent
6aa22bada8
commit
1a67642fd1
@ -47,9 +47,11 @@ import {
|
|||||||
TransformHandles,
|
TransformHandles,
|
||||||
TransformHandleType,
|
TransformHandleType,
|
||||||
} from "../element/transformHandles";
|
} from "../element/transformHandles";
|
||||||
import { viewportCoordsToSceneCoords } from "../utils";
|
import { viewportCoordsToSceneCoords, supportsEmoji } from "../utils";
|
||||||
import { UserIdleState } from "../excalidraw-app/collab/types";
|
import { UserIdleState } from "../excalidraw-app/collab/types";
|
||||||
|
|
||||||
|
const hasEmojiSupport = supportsEmoji();
|
||||||
|
|
||||||
const strokeRectWithRotation = (
|
const strokeRectWithRotation = (
|
||||||
context: CanvasRenderingContext2D,
|
context: CanvasRenderingContext2D,
|
||||||
x: number,
|
x: number,
|
||||||
@ -449,7 +451,7 @@ export const renderScene = (
|
|||||||
|
|
||||||
const userState = sceneState.remotePointerUserStates[clientId];
|
const userState = sceneState.remotePointerUserStates[clientId];
|
||||||
if (isOutOfBounds || userState === UserIdleState.AWAY) {
|
if (isOutOfBounds || userState === UserIdleState.AWAY) {
|
||||||
context.globalAlpha = 0.2;
|
context.globalAlpha = 0.48;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
@ -481,13 +483,24 @@ export const renderScene = (
|
|||||||
context.stroke();
|
context.stroke();
|
||||||
|
|
||||||
const username = sceneState.remotePointerUsernames[clientId];
|
const username = sceneState.remotePointerUsernames[clientId];
|
||||||
const usernameAndIdleState = `${username ? `${username} ` : ""}${
|
let usernameAndIdleState;
|
||||||
|
if (hasEmojiSupport) {
|
||||||
|
usernameAndIdleState = `${username ? `${username} ` : ""}${
|
||||||
userState === UserIdleState.AWAY
|
userState === UserIdleState.AWAY
|
||||||
? "⚫️"
|
? "⚫️"
|
||||||
: userState === UserIdleState.IDLE
|
: userState === UserIdleState.IDLE
|
||||||
? "💤"
|
? "💤"
|
||||||
: "🟢"
|
: "🟢"
|
||||||
}`;
|
}`;
|
||||||
|
} else {
|
||||||
|
usernameAndIdleState = `${username ? `${username}` : ""}${
|
||||||
|
userState === UserIdleState.AWAY
|
||||||
|
? ` (${UserIdleState.AWAY})`
|
||||||
|
: userState === UserIdleState.IDLE
|
||||||
|
? ` (${UserIdleState.IDLE})`
|
||||||
|
: ""
|
||||||
|
}`;
|
||||||
|
}
|
||||||
|
|
||||||
if (!isOutOfBounds && usernameAndIdleState) {
|
if (!isOutOfBounds && usernameAndIdleState) {
|
||||||
const offsetX = x + width;
|
const offsetX = x + width;
|
||||||
|
17
src/utils.ts
17
src/utils.ts
@ -369,3 +369,20 @@ export const getVersion = () => {
|
|||||||
DEFAULT_VERSION
|
DEFAULT_VERSION
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Adapted from https://github.com/Modernizr/Modernizr/blob/master/feature-detects/emoji.js
|
||||||
|
export const supportsEmoji = () => {
|
||||||
|
const canvas = document.createElement("canvas");
|
||||||
|
const ctx = canvas.getContext("2d");
|
||||||
|
if (!ctx) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const offset = 12;
|
||||||
|
ctx.fillStyle = "#f00";
|
||||||
|
ctx.textBaseline = "top";
|
||||||
|
ctx.font = "32px Arial";
|
||||||
|
// Modernizr used 🐨, but it is sort of supported on Windows 7.
|
||||||
|
// Luckily 😀 isn't supported.
|
||||||
|
ctx.fillText("😀", 0, 0);
|
||||||
|
return ctx.getImageData(offset, offset, 1, 1).data[0] !== 0;
|
||||||
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user