~cytrogen/masto-fe

e8243d5bbd85d2ac5247d4a54c0119a15af35612 — fusagiko / takayamaki 2 years ago 5f0d2b6
[Glitch] Add type annotation for some js files

Port e38b39194075bec88af2f3a5134137563024d391 to glitch-soc

Signed-off-by: Claire <claire.github-309c@sitedethib.com>
R app/javascript/flavours/glitch/blurhash.js => app/javascript/flavours/glitch/blurhash.ts +3 -3
@@ 84,7 84,7 @@ const DIGIT_CHARACTERS = [
  '~',
];

export const decode83 = (str) => {
export const decode83 = (str: string) => {
  let value = 0;
  let c, digit;



@@ 97,13 97,13 @@ export const decode83 = (str) => {
  return value;
};

export const intToRGB = int => ({
export const intToRGB = (int: number) => ({
  r: Math.max(0, (int >> 16)),
  g: Math.max(0, (int >> 8) & 255),
  b: Math.max(0, (int & 255)),
});

export const getAverageFromBlurhash = blurhash => {
export const getAverageFromBlurhash = (blurhash: string) => {
  if (!blurhash) {
    return null;
  }

R app/javascript/flavours/glitch/compare_id.js => app/javascript/flavours/glitch/compare_id.ts +1 -1
@@ 1,4 1,4 @@
export default function compareId (id1, id2) {
export default function compareId (id1: string, id2: string) {
  if (id1 === id2) {
    return 0;
  }

R app/javascript/flavours/glitch/is_mobile.js => app/javascript/flavours/glitch/is_mobile.ts +6 -14
@@ 1,21 1,12 @@
// @ts-check

import { supportsPassiveEvents } from 'detect-passive-events';
import { forceSingleColumn } from 'flavours/glitch/initial_state';

const LAYOUT_BREAKPOINT = 630;

/**
 * @param {number} width
 * @returns {boolean}
 */
export const isMobile = width => width <= LAYOUT_BREAKPOINT;

/**
 * @param {string} layout_local_setting
 * @returns {string}
 */
export const layoutFromWindow = (layout_local_setting) => {
export const isMobile = (width: number) => width <= LAYOUT_BREAKPOINT;

export type LayoutType = 'mobile' | 'single-column' | 'multi-column';
export const layoutFromWindow = (layout_local_setting : string): LayoutType => {
  switch (layout_local_setting) {
  case 'multiple':
    return 'multi-column';


@@ 36,8 27,9 @@ export const layoutFromWindow = (layout_local_setting) => {
  }
};

// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-expect-error
const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && !window.MSStream;
const iOS = /iPad|iPhone|iPod/.test(navigator.userAgent) && window.MSStream != null;

const listenerOptions = supportsPassiveEvents ? { passive: true } : false;


R app/javascript/flavours/glitch/permissions.js => app/javascript/flavours/glitch/permissions.ts +0 -0
R app/javascript/flavours/glitch/scroll.js => app/javascript/flavours/glitch/scroll.ts +4 -5
@@ 1,6 1,5 @@
const easingOutQuint = (x, t, b, c, d) => c * ((t = t / d - 1) * t * t * t * t + 1) + b;

const scroll = (node, key, target) => {
const easingOutQuint = (x: number, t: number, b: number, c: number, d: number) => c * ((t = t / d - 1) * t * t * t * t + 1) + b;
const scroll = (node: Element, key: 'scrollTop' | 'scrollLeft', target: number) => {
  const startTime = Date.now();
  const offset    = node[key];
  const gap       = target - offset;


@@ 28,5 27,5 @@ const scroll = (node, key, target) => {

const isScrollBehaviorSupported = 'scrollBehavior' in document.documentElement.style;

export const scrollRight = (node, position) => isScrollBehaviorSupported ? node.scrollTo({ left: position, behavior: 'smooth' }) : scroll(node, 'scrollLeft', position);
export const scrollTop = (node) => isScrollBehaviorSupported ? node.scrollTo({ top: 0, behavior: 'smooth' }) : scroll(node, 'scrollTop', 0);
export const scrollRight = (node: Element, position: number) => isScrollBehaviorSupported ? node.scrollTo({ left: position, behavior: 'smooth' }) : scroll(node, 'scrollLeft', position);
export const scrollTop = (node: Element) => isScrollBehaviorSupported ? node.scrollTo({ top: 0, behavior: 'smooth' }) : scroll(node, 'scrollTop', 0);

M app/javascript/flavours/glitch/types/resources.ts => app/javascript/flavours/glitch/types/resources.ts +1 -5
@@ 1,8 1,4 @@
interface MastodonMap<T> {
  get<K extends keyof T>(key: K): T[K];
  has<K extends keyof T>(key: K): boolean;
  set<K extends keyof T>(key: K, value: T[K]): this;
}
import type { MastodonMap } from './util';

type AccountValues = {
  id: number;

A app/javascript/flavours/glitch/types/util.ts => app/javascript/flavours/glitch/types/util.ts +7 -0
@@ 0,0 1,7 @@
export interface MastodonMap<T> {
  get<K extends keyof T>(key: K): T[K];
  has<K extends keyof T>(key: K): boolean;
  set<K extends keyof T>(key: K, value: T[K]): this;
}

export type ValueOf<T> = T[keyof T];

R app/javascript/flavours/glitch/utils/base64.js => app/javascript/flavours/glitch/utils/base64.ts +1 -1
@@ 1,4 1,4 @@
export const decode = base64 => {
export const decode = (base64: string): Uint8Array => {
  const rawData = window.atob(base64);
  const outputArray = new Uint8Array(rawData.length);


R app/javascript/flavours/glitch/utils/filters.js => app/javascript/flavours/glitch/utils/filters.ts +1 -1
@@ 1,4 1,4 @@
export const toServerSideType = columnType => {
export const toServerSideType = (columnType: string) => {
  switch (columnType) {
  case 'home':
  case 'notifications':

R app/javascript/flavours/glitch/utils/numbers.js => app/javascript/flavours/glitch/utils/numbers.ts +12 -19
@@ 1,31 1,28 @@
// @ts-check
import type { ValueOf } from 'flavours/glitch/types/util';

export const DECIMAL_UNITS = Object.freeze({
  ONE: 1,
  TEN: 10,
  HUNDRED: Math.pow(10, 2),
  THOUSAND: Math.pow(10, 3),
  MILLION: Math.pow(10, 6),
  BILLION: Math.pow(10, 9),
  TRILLION: Math.pow(10, 12),
  HUNDRED: 100,
  THOUSAND: 1_000,
  MILLION: 1_000_000,
  BILLION: 1_000_000_000,
  TRILLION: 1_000_000_000_000,
});
export type DecimalUnits = ValueOf<typeof DECIMAL_UNITS>;

const TEN_THOUSAND = DECIMAL_UNITS.THOUSAND * 10;
const TEN_MILLIONS = DECIMAL_UNITS.MILLION * 10;

/**
 * @typedef {[number, number, number]} ShortNumber
 * Array of: shorten number, unit of shorten number and maximum fraction digits
 */

/**
 * @param {number} sourceNumber Number to convert to short number
 * @returns {ShortNumber} Calculated short number
 * @example
 * shortNumber(5936);
 * // => [5.936, 1000, 1]
 */
export function toShortNumber(sourceNumber) {
export type ShortNumber = [number, DecimalUnits, 0 | 1] // Array of: shorten number, unit of shorten number and maximum fraction digits
export function toShortNumber(sourceNumber: number): ShortNumber {
  if (sourceNumber < DECIMAL_UNITS.THOUSAND) {
    return [sourceNumber, DECIMAL_UNITS.ONE, 0];
  } else if (sourceNumber < DECIMAL_UNITS.MILLION) {


@@ 59,20 56,16 @@ export function toShortNumber(sourceNumber) {
 * pluralReady(1793, DECIMAL_UNITS.THOUSAND)
 * // => 1790
 */
export function pluralReady(sourceNumber, division) {
export function pluralReady(sourceNumber: number, division: DecimalUnits): number {
  if (division == null || division < DECIMAL_UNITS.HUNDRED) {
    return sourceNumber;
  }

  let closestScale = division / DECIMAL_UNITS.TEN;
  const closestScale = division / DECIMAL_UNITS.TEN;

  return Math.trunc(sourceNumber / closestScale) * closestScale;
}

/**
 * @param {number} num
 * @returns {number}
 */
export function roundTo10(num) {
export function roundTo10(num: number): number {
  return Math.round(num * 0.1) / 0.1;
}