From 75f06a7c9e8583f787183d1662465c3f1d58bdb9 Mon Sep 17 00:00:00 2001 From: Matilde Park Date: Wed, 21 Apr 2021 17:22:08 -0400 Subject: [PATCH] landscape/logic: type safety adjustments --- pkg/interface/package-lock.json | Bin 429608 -> 429552 bytes pkg/interface/package.json | 2 +- pkg/interface/src/logic/lib/publish.ts | 25 +++++++++++------- pkg/interface/src/logic/lib/tutorialModal.ts | 5 ++-- .../src/logic/lib/useLocalStorageState.ts | 3 ++- pkg/interface/src/logic/lib/useModal.tsx | 6 +---- .../src/logic/lib/usePreviousValue.ts | 2 +- pkg/interface/src/logic/lib/useRunIO.ts | 3 +-- .../logic/lib/useStatelessAsyncClickable.ts | 2 +- pkg/interface/src/logic/lib/useStorage.ts | 2 +- pkg/interface/src/logic/lib/util.ts | 7 +++-- pkg/interface/src/logic/lib/workspace.ts | 3 ++- .../src/logic/reducers/connection.ts | 3 +-- .../src/logic/reducers/group-update.ts | 14 +++++----- .../src/logic/reducers/hark-update.ts | 20 ++++++-------- .../src/logic/reducers/launch-update.ts | 2 +- .../src/logic/reducers/settings-update.ts | 21 ++++++++------- pkg/interface/src/logic/state/launch.ts | 2 +- pkg/interface/src/logic/store/store.ts | 4 --- 19 files changed, 62 insertions(+), 64 deletions(-) diff --git a/pkg/interface/package-lock.json b/pkg/interface/package-lock.json index eb9e97a959c34666425ef5393de036f69b60436c..df58334137985b74a5f67df1f0c4d1ce3c84b931 100644 GIT binary patch delta 165 zcmV;W09ya3oEq?(8i0fWgaU*Egaot&#mJYbJ_9zF`^W_t12ir&lfhynRaPryc5GQl zT5eHmVR|@JQbKijR6#j1d0IkHZ*+1sNGn%pQ8!{lGiX{>Ze(~hbVpBNF=ll`XJu1r zctLtiF;ZzxHA#AQVPr{IR90nXb#-@ILsFAbl^2&_%moj(waEo?L6?w81|7Fx3kKl` TmvHL?IG6BI1{Jre6b62Ix)(g< delta 218 zcmew`TWZA|sfHHD7N!>F7M3lnM^7*t>sd}$(key: string, initial: T): T { interface SetStateFunc { (t: T): T; } -type SetState = T | SetStateFunc; +// See microsoft/typescript#37663 for filed bug +type SetState = T extends any ? SetStateFunc : never; export function useLocalStorageState(key: string, initial: T) { const [state, _setState] = useState(() => retrieve(key, initial)); diff --git a/pkg/interface/src/logic/lib/useModal.tsx b/pkg/interface/src/logic/lib/useModal.tsx index 3d19343cd..61c13d4d0 100644 --- a/pkg/interface/src/logic/lib/useModal.tsx +++ b/pkg/interface/src/logic/lib/useModal.tsx @@ -2,18 +2,14 @@ import React, { useState, ReactNode, useCallback, - SyntheticEvent, useMemo, - useEffect, useRef } from 'react'; import { Box } from '@tlon/indigo-react'; -import { useOutsideClick } from './useOutsideClick'; import { ModalOverlay } from '~/views/components/ModalOverlay'; import { Portal } from '~/views/components/Portal'; -import { ModalPortal } from '~/views/components/ModalPortal'; -import { PropFunc } from '@urbit/api'; +import { PropFunc } from '~/types'; type ModalFunc = (dismiss: () => void) => JSX.Element; interface UseModalProps { diff --git a/pkg/interface/src/logic/lib/usePreviousValue.ts b/pkg/interface/src/logic/lib/usePreviousValue.ts index 109f9ffa8..e4ee5a8f5 100644 --- a/pkg/interface/src/logic/lib/usePreviousValue.ts +++ b/pkg/interface/src/logic/lib/usePreviousValue.ts @@ -1,5 +1,5 @@ import { useRef } from 'react'; -import { Primitive } from '@urbit/api'; +import { Primitive } from '~/types'; export default function usePreviousValue(value: T): T { const prev = useRef(null); diff --git a/pkg/interface/src/logic/lib/useRunIO.ts b/pkg/interface/src/logic/lib/useRunIO.ts index bfaee2c54..a08ac8268 100644 --- a/pkg/interface/src/logic/lib/useRunIO.ts +++ b/pkg/interface/src/logic/lib/useRunIO.ts @@ -1,5 +1,4 @@ import { useState, useEffect } from "react"; -import { useWaitForProps } from "./useWaitForProps"; import {unstable_batchedUpdates} from "react-dom"; export type IOInstance = ( @@ -10,7 +9,7 @@ export function useRunIO( io: (i: I) => Promise, after: (o: O) => void, key: string -): () => Promise { +): (i: I) => Promise { const [resolve, setResolve] = useState<() => void>(() => () => {}); const [reject, setReject] = useState<(e: any) => void>(() => () => {}); const [output, setOutput] = useState(null); diff --git a/pkg/interface/src/logic/lib/useStatelessAsyncClickable.ts b/pkg/interface/src/logic/lib/useStatelessAsyncClickable.ts index 154f903ba..8bf79bdfc 100644 --- a/pkg/interface/src/logic/lib/useStatelessAsyncClickable.ts +++ b/pkg/interface/src/logic/lib/useStatelessAsyncClickable.ts @@ -5,7 +5,7 @@ export function useStatelessAsyncClickable( onClick: (e: MouseEvent) => Promise, name: string ) { - const [state, setState] = useState('waiting'); + const [state, setState] = useState('waiting'); const handleClick = useCallback( async (e: MouseEvent) => { try { diff --git a/pkg/interface/src/logic/lib/useStorage.ts b/pkg/interface/src/logic/lib/useStorage.ts index 64f9bb450..6ad463009 100644 --- a/pkg/interface/src/logic/lib/useStorage.ts +++ b/pkg/interface/src/logic/lib/useStorage.ts @@ -16,7 +16,7 @@ export interface IuseStorage { upload: (file: File, bucket: string) => Promise; uploadDefault: (file: File) => Promise; uploading: boolean; - promptUpload: () => Promise; + promptUpload: () => Promise; } const useStorage = ({ accept = '*' } = { accept: '*' }): IuseStorage => { diff --git a/pkg/interface/src/logic/lib/util.ts b/pkg/interface/src/logic/lib/util.ts index f34e8f76b..fe2ca5259 100644 --- a/pkg/interface/src/logic/lib/util.ts +++ b/pkg/interface/src/logic/lib/util.ts @@ -192,7 +192,10 @@ export function uxToHex(ux: string) { export const hexToUx = (hex) => { const ux = f.flow( f.chunk(4), - f.map(x => _.dropWhile(x, y => y === 0).join('')), + // eslint-disable-next-line prefer-arrow-callback + f.map(x => _.dropWhile(x, function(y: unknown) { + return y === 0; + }).join('')), f.join('.') )(hex.split('')); return `0x${ux}`; @@ -417,7 +420,7 @@ export const useHovering = (): useHoveringInterface => { onMouseLeave, }), [onMouseLeave, onMouseOver]); - + return useMemo(() => ({ hovering, bind }), [hovering, bind]); }; diff --git a/pkg/interface/src/logic/lib/workspace.ts b/pkg/interface/src/logic/lib/workspace.ts index f13df6195..ae64610cb 100644 --- a/pkg/interface/src/logic/lib/workspace.ts +++ b/pkg/interface/src/logic/lib/workspace.ts @@ -1,4 +1,5 @@ -import { Associations, Workspace } from '@urbit/api'; +import { Associations } from '@urbit/api'; +import { Workspace } from '~/types'; export function getTitleFromWorkspace( associations: Associations, diff --git a/pkg/interface/src/logic/reducers/connection.ts b/pkg/interface/src/logic/reducers/connection.ts index 958465433..aca093701 100644 --- a/pkg/interface/src/logic/reducers/connection.ts +++ b/pkg/interface/src/logic/reducers/connection.ts @@ -1,5 +1,4 @@ -import _ from 'lodash'; -import { StoreState } from '../../store/type'; +import { StoreState } from '../store/type'; import { Cage } from '~/types/cage'; type LocalState = Pick; diff --git a/pkg/interface/src/logic/reducers/group-update.ts b/pkg/interface/src/logic/reducers/group-update.ts index 6b8c25c92..404b848e8 100644 --- a/pkg/interface/src/logic/reducers/group-update.ts +++ b/pkg/interface/src/logic/reducers/group-update.ts @@ -5,16 +5,14 @@ import { Group, Tags, GroupPolicy, - GroupPolicyDiff, OpenPolicyDiff, OpenPolicy, InvitePolicyDiff, InvitePolicy } from '@urbit/api/groups'; -import { Enc, PatpNoSig } from '@urbit/api'; +import { Enc } from '@urbit/api'; import { resourceAsPath } from '../lib/util'; import useGroupState, { GroupState } from '../state/group'; -import { compose } from 'lodash/fp'; import { reduceState } from '../state/base'; function decodeGroup(group: Enc): Group { @@ -45,11 +43,11 @@ function decodeTags(tags: Enc): Tags { tags, (acc, ships, key): Tags => { if (key.search(/\\/) === -1) { - acc.role[key] = new Set(ships); + acc.role[key] = new Set([ships]); return acc; } else { const [app, tag, resource] = key.split('\\'); - _.set(acc, [app, resource, tag], new Set(ships)); + _.set(acc, [app, resource, tag], new Set([ships])); return acc; } }, @@ -125,9 +123,9 @@ const addMembers = (json: GroupUpdate, state: GroupState): GroupState => { state.groups[resourcePath].members.add(member); if ( 'invite' in state.groups[resourcePath].policy && - state.groups[resourcePath].policy.invite.pending.has(member) + state.groups[resourcePath].policy['invite'].pending.has(member) ) { - state.groups[resourcePath].policy.invite.pending.delete(member) + state.groups[resourcePath].policy['invite'].pending.delete(member); } } } @@ -159,7 +157,7 @@ const addTag = (json: GroupUpdate, state: GroupState): GroupState => { _.set(tags, tagAccessors, tagged); } return state; -} +}; const removeTag = (json: GroupUpdate, state: GroupState): GroupState => { if ('removeTag' in json) { diff --git a/pkg/interface/src/logic/reducers/hark-update.ts b/pkg/interface/src/logic/reducers/hark-update.ts index 8ba97f91a..66392fb8d 100644 --- a/pkg/interface/src/logic/reducers/hark-update.ts +++ b/pkg/interface/src/logic/reducers/hark-update.ts @@ -1,18 +1,14 @@ import { - Notifications, NotifIndex, - NotificationGraphConfig, - GroupNotificationsConfig, - UnreadStats, Timebox } from '@urbit/api'; import { makePatDa } from '~/logic/lib/util'; import _ from 'lodash'; -import BigIntOrderedMap from "@urbit/api/lib/BigIntOrderedMap"; +import BigIntOrderedMap from '@urbit/api/lib/BigIntOrderedMap'; import useHarkState, { HarkState } from '../state/hark'; import { compose } from 'lodash/fp'; import { reduceState } from '../state/base'; -import bigInt, {BigInteger} from 'big-integer'; +import {BigInteger} from 'big-integer'; export const HarkReducer = (json: any) => { const data = _.get(json, 'harkUpdate', false); @@ -151,7 +147,7 @@ function graphWatchSelf(json: any, state: HarkState): HarkState { function readAll(json: any, state: HarkState): HarkState { const data = _.get(json, 'read-all'); - if(data) { + if(data) { clearState(state); } return state; @@ -264,7 +260,7 @@ function updateUnreads(state: HarkState, index: NotifIndex, f: (us: Set) if(!('graph' in index)) { return state; } - let unreads = _.get(state.unreads.graph, [index.graph.graph, index.graph.index, 'unreads'], new Set()); + let unreads: any = _.get(state.unreads.graph, [index.graph.graph, index.graph.index, 'unreads'], new Set()); f(unreads); _.set(state.unreads.graph, [index.graph.graph, index.graph.index, 'unreads'], unreads); @@ -278,7 +274,7 @@ function addNotificationToUnread(state: HarkState, index: NotifIndex, time: BigI _.set(state.unreads.graph, path, [ ...curr.filter(c => !(c.time.eq(time) && notifIdxEqual(c.index, index))), - { time, index} + { time, index } ] ); } else if ('group' in index) { @@ -287,7 +283,7 @@ function addNotificationToUnread(state: HarkState, index: NotifIndex, time: BigI _.set(state.unreads.group, path, [ ...curr.filter(c => !(c.time.eq(time) && notifIdxEqual(c.index, index))), - { time, index} + { time, index } ] ); } @@ -312,10 +308,10 @@ function removeNotificationFromUnread(state: HarkState, index: NotifIndex, time: function updateNotificationStats(state: HarkState, index: NotifIndex, statField: 'unreads' | 'last', f: (x: number) => number) { if('graph' in index) { - const curr = _.get(state.unreads.graph, [index.graph.graph, index.graph.index, statField], 0); + const curr: any = _.get(state.unreads.graph, [index.graph.graph, index.graph.index, statField], 0); _.set(state.unreads.graph, [index.graph.graph, index.graph.index, statField], f(curr)); } else if('group' in index) { - const curr = _.get(state.unreads.group, [index.group.group, statField], 0); + const curr: any = _.get(state.unreads.group, [index.group.group, statField], 0); _.set(state.unreads.group, [index.group.group, statField], f(curr)); } } diff --git a/pkg/interface/src/logic/reducers/launch-update.ts b/pkg/interface/src/logic/reducers/launch-update.ts index 598731bf8..7dfe948e3 100644 --- a/pkg/interface/src/logic/reducers/launch-update.ts +++ b/pkg/interface/src/logic/reducers/launch-update.ts @@ -18,7 +18,7 @@ export default class LaunchReducer { ]); } - const weatherData: WeatherState = _.get(json, 'weather', false); + const weatherData: WeatherState | boolean | Record = _.get(json, 'weather', false); if (weatherData) { useLaunchState.getState().set(state => { state.weather = weatherData; diff --git a/pkg/interface/src/logic/reducers/settings-update.ts b/pkg/interface/src/logic/reducers/settings-update.ts index 1d43f517b..025afb29b 100644 --- a/pkg/interface/src/logic/reducers/settings-update.ts +++ b/pkg/interface/src/logic/reducers/settings-update.ts @@ -1,7 +1,8 @@ import _ from 'lodash'; -import useSettingsState, { SettingsState } from "~/logic/state/settings"; -import { SettingsUpdate } from '@urbit/api/dist/settings'; +import useSettingsState, { SettingsState } from '~/logic/state/settings'; +import { SettingsUpdate } from '@urbit/api/settings'; import { reduceState } from '../state/base'; +import { string } from 'prop-types'; export default class SettingsReducer { reduce(json: any) { @@ -40,21 +41,21 @@ export default class SettingsReducer { return state; } - putEntry(json: SettingsUpdate, state: SettingsState): SettingsState { - const data = _.get(json, 'put-entry', false); + putEntry(json: SettingsUpdate, state: any): SettingsState { + const data: Record = _.get(json, 'put-entry', false); if (data) { - if (!state[data["bucket-key"]]) { - state[data["bucket-key"]] = {}; + if (!state[data['bucket-key']]) { + state[data['bucket-key']] = {}; } - state[data["bucket-key"]][data["entry-key"]] = data.value; + state[data['bucket-key']][data['entry-key']] = data.value; } return state; } - delEntry(json: SettingsUpdate, state: SettingsState): SettingsState { + delEntry(json: SettingsUpdate, state: any): SettingsState { const data = _.get(json, 'del-entry', false); if (data) { - delete state[data["bucket-key"]][data["entry-key"]]; + delete state[data['bucket-key']][data['entry-key']]; } return state; } @@ -76,7 +77,7 @@ export default class SettingsReducer { return state; } - getEntry(json: any, state: SettingsState) { + getEntry(json: any, state: any) { const bucketKey = _.get(json, 'bucket-key', false); const entryKey = _.get(json, 'entry-key', false); const entry = _.get(json, 'entry', false); diff --git a/pkg/interface/src/logic/state/launch.ts b/pkg/interface/src/logic/state/launch.ts index 14f2113e5..225c00294 100644 --- a/pkg/interface/src/logic/state/launch.ts +++ b/pkg/interface/src/logic/state/launch.ts @@ -9,7 +9,7 @@ export interface LaunchState extends BaseState { tiles: { [app: string]: Tile; }, - weather: WeatherState | null, + weather: WeatherState | null | Record | boolean, userLocation: string | null; baseHash: string | null; }; diff --git a/pkg/interface/src/logic/store/store.ts b/pkg/interface/src/logic/store/store.ts index 3f77beb9c..bfc26accc 100644 --- a/pkg/interface/src/logic/store/store.ts +++ b/pkg/interface/src/logic/store/store.ts @@ -3,10 +3,8 @@ import _ from 'lodash'; import BaseStore from './base'; import InviteReducer from '../reducers/invite-update'; import MetadataReducer from '../reducers/metadata-update'; -import LocalReducer from '../reducers/local'; import { StoreState } from './type'; -import { Timebox } from '@urbit/api'; import { Cage } from '~/types/cage'; import S3Reducer from '../reducers/s3-update'; import { GraphReducer } from '../reducers/graph-update'; @@ -17,8 +15,6 @@ import LaunchReducer from '../reducers/launch-update'; import ConnectionReducer from '../reducers/connection'; import SettingsReducer from '../reducers/settings-update'; import GcpReducer from '../reducers/gcp-reducer'; -import { OrderedMap } from '../lib/OrderedMap'; -import { BigIntOrderedMap } from '../lib/BigIntOrderedMap'; import { GroupViewReducer } from '../reducers/group-view'; import { unstable_batchedUpdates } from 'react-dom';