SYMBOL INDEX (428 symbols across 77 files) FILE: src/bootstrap.tsx method onControllerChange (line 40) | onControllerChange() { method onUpdate (line 43) | onUpdate(registration) { FILE: src/components/app/appHeader.tsx function AlertDefault (line 18) | function AlertDefault() { function AlertEn (line 51) | function AlertEn() { function AlertJa (line 91) | function AlertJa() { function AlertKo (line 124) | function AlertKo() { function AppHeader (line 162) | function AppHeader() { FILE: src/components/app/index.tsx function App (line 58) | function App() { FILE: src/components/app/maintenance.tsx function MaintenanceHandler (line 8) | function MaintenanceHandler({ children }: { children: React.ReactElement... FILE: src/components/app/navbar.tsx constant NAV_ITEMS (line 34) | const NAV_ITEMS = [ constant SITE_LINKS (line 42) | const SITE_LINKS = [ constant LANGUAGES (line 47) | const LANGUAGES = [ function isActive (line 55) | function isActive(match: any, location: Location): boolean { function HideOnScroll (line 62) | function HideOnScroll({ children }: { children: ReactElement }) { function handleSwitchSite (line 81) | function handleSwitchSite(e: React.MouseEvent) { function DesktopItems (line 90) | function DesktopItems() { function MobileItems (line 136) | function MobileItems() { constant NAVBAR_THEME (line 203) | const NAVBAR_THEME: ThemeOptions = { function Navbar (line 238) | function Navbar() { FILE: src/components/app/routes.tsx function Routes (line 19) | function Routes() { FILE: src/components/app/theme.tsx constant LOCALES (line 15) | const LOCALES: { [key: string]: Localization } = { constant DEFAULT_LOCALE (line 20) | const DEFAULT_LOCALE = zhCN; constant FONTS (line 22) | const FONTS: { [key: string]: string } = { constant DEFAULT_FONT (line 27) | const DEFAULT_FONT = '"Roboto", "Microsoft YaHei", "Meiryo", sans-serif'; constant THEME_BASIC (line 29) | const THEME_BASIC: ThemeOptions = { constant THEME_VALUES (line 50) | const THEME_VALUES = createTheme(THEME_BASIC); constant THEME (line 52) | const THEME: ThemeOptions = { function OverrideTheme (line 176) | function OverrideTheme({ theme, children }: { theme: ThemeOptions; child... function RootThemeProvider (line 180) | function RootThemeProvider({ children }: { children: ReactNode }) { FILE: src/components/charts/simplePieChart.tsx constant DEFAULT_COLORS (line 15) | const DEFAULT_COLORS = ["#003f5c", "#7a5195", "#ef5675", "#ffa600"]; constant RADIAN (line 24) | const RADIAN = Math.PI / 180; type PieChartItem (line 64) | type PieChartItem = { function defaultInnerLabel (line 70) | function defaultInnerLabel(item: T) { function defaultOuterLabel (line 73) | function defaultOuterLabel(item: T) { function labelLine (line 76) | function labelLine(item: T) { function SimplePieChart (line 83) | function SimplePieChart({ FILE: src/components/contestTools/index.tsx constant ROUTES (line 8) | const ROUTES = ( function Routes (line 18) | function Routes() { FILE: src/components/contestTools/minMax.tsx function MinMax (line 10) | function MinMax() { FILE: src/components/form/checkboxGroup.tsx type CheckboxItem (line 14) | interface CheckboxItem { type GroupParams (line 20) | type GroupParams = { function InternalRadioGroup (line 28) | function InternalRadioGroup({ function InternalCheckboxGroup (line 70) | function InternalCheckboxGroup({ function CheckboxGroup (line 152) | function CheckboxGroup( FILE: src/components/form/datePicker.tsx function DatePicker (line 10) | function DatePicker({ FILE: src/components/gameRecords/columns.tsx type ActivePlayerId (line 13) | type ActivePlayerId = number | string | ((x: GameRecord) => number | str... type PlayersProps (line 14) | type PlayersProps = { type TableColumnDefKey (line 80) | type TableColumnDefKey = { type TableColumn (line 83) | type TableColumn = React.FunctionComponentElement | false | unde... type TableColumnDef (line 84) | type TableColumnDef = TableColumnDefKey & (() => TableColumn); function makeColumn (line 87) | function makeColumn(builder: (...args: T) => TableC... constant COLUMN_GAMEMODE (line 103) | const COLUMN_GAMEMODE = makeColumn( constant COLUMN_RANK (line 125) | const COLUMN_RANK = makeColumn((activePlayerId: number | string) => ( constant COLUMN_PLAYERS (line 145) | const COLUMN_PLAYERS = makeColumn((props: Partial ( constant COLUMN_ENDTIME (line 173) | const COLUMN_ENDTIME = makeColumn(() => ( constant COLUMN_FULLTIME (line 189) | const COLUMN_FULLTIME = makeColumn(() => ( FILE: src/components/gameRecords/dataAdapterProvider.tsx type ItemLoadingPlaceholder (line 14) | interface ItemLoadingPlaceholder { type IDataAdapter (line 20) | interface IDataAdapter { class DummyDataAdapter (line 29) | class DummyDataAdapter implements IDataAdapter { method getCount (line 30) | getCount(): number { method hasCount (line 33) | hasCount(): boolean { method getUnfilteredCount (line 36) | getUnfilteredCount(): number { method getMetadata (line 39) | getMetadata(): T | null { method getItem (line 42) | getItem(): GameRecord | ItemLoadingPlaceholder { method isItemLoaded (line 45) | isItemLoaded(): boolean { constant DUMMY_DATA_ADAPTER (line 50) | const DUMMY_DATA_ADAPTER = new DummyDataAdapter() as IDataAdapter; class DataAdapter (line 55) | class DataAdapter implements IDataAdapter { method constructor (line 60) | constructor(provider: DataProvider, onDataUpdate = noop) { method _installHook (line 65) | _installHook(promise: Promise) { method _callHook (line 72) | _callHook(error: Error | ApiError | false) { method getCount (line 78) | getCount(): number { method hasCount (line 91) | hasCount(): boolean { method getUnfilteredCount (line 99) | getUnfilteredCount(): number { method getMetadata (line 107) | getMetadata(): T | null { method getItem (line 115) | getItem(index: number): GameRecord | ItemLoadingPlaceholder { method isItemLoaded (line 127) | isItemLoaded(index: number): boolean { method setUpdateHook (line 133) | setUpdateHook(hook: () => void) { method cancelUpdateHook (line 136) | cancelUpdateHook() { function getProviderKey (line 146) | function getProviderKey(model: Model): string { function createProvider (line 158) | function createProvider(model: Model): DataProvider { function usePredicate (line 168) | function usePredicate(model: Model): FilterPredicate { function useDataAdapterCommon (line 205) | function useDataAdapterCommon( function DataAdapterProvider (line 261) | function DataAdapterProvider({ children }: { children: ReactChild | Reac... function DataAdapterProviderCustom (line 346) | function DataAdapterProviderCustom({ FILE: src/components/gameRecords/extraFilterPredicate.tsx function ExtraFilterPredicateProvider (line 14) | function ExtraFilterPredicateProvider({ children }: { children: React.Re... FILE: src/components/gameRecords/filterPanel.tsx constant DEFAULT_DATE (line 13) | const DEFAULT_DATE = dayjs().startOf("day"); function FilterPanel (line 15) | function FilterPanel() { FILE: src/components/gameRecords/home.tsx function Home (line 14) | function Home() { FILE: src/components/gameRecords/index.tsx function GameRecords (line 8) | function GameRecords() { FILE: src/components/gameRecords/modeSelector.tsx function ModeSelector (line 8) | function ModeSelector({ FILE: src/components/gameRecords/model.tsx type ListingModel (line 9) | interface ListingModel { type PlayerModel (line 15) | interface PlayerModel { type Model (line 26) | type Model = ListingModel | PlayerModel; method removeExtraParams (line 29) | removeExtraParams(model: Model): Model { method hasAdvancedParams (line 50) | hasAdvancedParams(model: Model): boolean { type ModelUpdate (line 54) | type ModelUpdate = Partial | ({ type: "player" } & Partial... type DispatchModelUpdate (line 55) | type DispatchModelUpdate = (props: ModelUpdate) => void; constant DEFAULT_MODEL (line 57) | const DEFAULT_MODEL: ListingModel = { type: undefined, date: null, selec... function normalizeUpdate (line 61) | function normalizeUpdate(newProps: ModelUpdate): ModelUpdate { function isSameModel (line 75) | function isSameModel(a: Model, b: Model): boolean { function ModelProvider (line 82) | function ModelProvider({ children }: { children: ReactChild | ReactChild... FILE: src/components/gameRecords/playerSearch.tsx type PlayerSearchResultExt (line 14) | type PlayerSearchResultExt = PlayerSearchResult & { constant NUM_FETCH (line 19) | const NUM_FETCH = 20; function findRawResultFromCache (line 23) | function findRawResultFromCache(prefix: string): { result: PlayerSearchR... function getCrossSiteConf (line 40) | function getCrossSiteConf(x: PlayerSearchResultExt) { function getOptionLabel (line 49) | function getOptionLabel(x: PlayerSearchResultExt, t: (x: string) => stri... function PlayerSearch (line 57) | function PlayerSearch() { FILE: src/components/gameRecords/routeSync.tsx type ListingRouteParams (line 11) | type ListingRouteParams = { type PlayerRouteParams (line 17) | type PlayerRouteParams = { function parseOptionalDate (line 28) | function parseOptionalDate( method player (line 46) | player(params: PlayerRouteParams): Model | string { method listing (line 73) | listing(params: ListingRouteParams): Model | string { function RouteSync (line 88) | function RouteSync({ view }: { view: keyof typeof ModelBuilders }): Reac... FILE: src/components/gameRecords/routeUtils.tsx constant PLAYER_PATH (line 5) | const PLAYER_PATH = constant PATH (line 7) | const PATH = "/:date(\\d{4}-\\d{2}-\\d{2})/:mode([0-9]+)?/:search?"; function dateToStringSafe (line 8) | function dateToStringSafe(value: dayjs.ConfigType | null | undefined): s... function generatePath (line 25) | function generatePath(model: Model): string { function generatePlayerPathById (line 67) | function generatePlayerPathById(playerId: number | string): string { FILE: src/components/gameRecords/routes.tsx function Routes (line 18) | function Routes() { FILE: src/components/gameRecords/table.tsx function GameRecordTable (line 29) | function GameRecordTable({ columns }: { columns: TableColumnDef[] }) { FILE: src/components/gameRecords/tableViews.tsx function GameRecordTablePlayerView (line 13) | function GameRecordTablePlayerView() { function GameRecordTableHomeView (line 30) | function GameRecordTableHomeView() { FILE: src/components/misc/alert.tsx function Alert (line 8) | function Alert({ FILE: src/components/misc/canonicalLink.tsx function CanonicalLink (line 6) | function CanonicalLink() { FILE: src/components/misc/customizedLoadable.tsx function CustomizedLoadable (line 5) | function CustomizedLoadable>({ FILE: src/components/misc/loading.tsx function Loading (line 3) | function Loading({ size = "normal" }: { size?: "normal" | "small" }) { FILE: src/components/misc/menuButton.tsx function MenuButton (line 4) | function MenuButton({ FILE: src/components/misc/scroller.tsx function Scroller (line 10) | function Scroller({ children }: { children: ReactChild | ReactChild[] }) { FILE: src/components/misc/tracker.tsx type Ga (line 8) | type Ga = NonNullable; type Window (line 11) | interface Window { function PageCategory (line 16) | function PageCategory({ category }: { category: string }) { function TrackerImpl (line 27) | function TrackerImpl() { function Tracker (line 53) | function Tracker() { FILE: src/components/modeModel/model.tsx type Model (line 5) | interface Model { type ModelUpdate (line 10) | type ModelUpdate = Partial; type DispatchModelUpdate (line 11) | type DispatchModelUpdate = (props: ModelUpdate) => void; constant DEFAULT_MODEL (line 13) | const DEFAULT_MODEL: Model = { selectedModes: [] }; function ModelModeProvider (line 18) | function ModelModeProvider({ children }: { children: ReactChild | ReactC... FILE: src/components/modeModel/modelModeSelector.tsx function ModelModeSelector (line 9) | function ModelModeSelector({ FILE: src/components/playerDetails/charts/rankRate.tsx constant CELLS (line 15) | const CELLS = generateCells(-1); FILE: src/components/playerDetails/charts/recentRank.tsx type DotProps (line 15) | interface DotProps { type DotPayload (line 24) | type DotPayload = { FILE: src/components/playerDetails/charts/winLoseDistribution.tsx function buildItems (line 9) | function buildItems( FILE: src/components/playerDetails/dateRangeSetting.tsx constant NEW_THRONE_TS (line 23) | const NEW_THRONE_TS = dayjs("2021-08-26T02:00:00.000Z"); function ResponsiveMenu (line 25) | function ResponsiveMenu({ children, ...params }: MenuProps) { function MenuGroup (line 57) | function MenuGroup({ children, ...params }: MenuListProps) { function DatePickerMenuItem (line 66) | function DatePickerMenuItem({ function DateRangeSetting (line 148) | function DateRangeSetting({ FILE: src/components/playerDetails/estimatedStableLevel.tsx constant ENABLED_MODES (line 10) | const ENABLED_MODES = [ function EstimatedStableLevel (line 21) | function EstimatedStableLevel({ metadata }: { metadata: PlayerMetadata }) { FILE: src/components/playerDetails/extraSettings.tsx constant RANK_ITEMS (line 22) | const RANK_ITEMS = [ function ExtraSettingsBody (line 36) | function ExtraSettingsBody({ model, updateModel }: { model: Model; updat... function ExtraSettingsDialog (line 90) | function ExtraSettingsDialog({ open, onClose }: { open: boolean; onClose... function ExtraSettings (line 123) | function ExtraSettings() { FILE: src/components/playerDetails/histogram.tsx constant VIEWBOX_HEIGHT (line 11) | const VIEWBOX_HEIGHT = 40; function generatePath (line 13) | function generatePath(bins: number[], barMax: number, start: number) { function shouldUseClamped (line 17) | function shouldUseClamped(value: number | undefined, data: HistogramGrou... function getValueAccumulation (line 24) | function getValueAccumulation(value: number, data: HistogramData) { function useStatHistogram (line 156) | function useStatHistogram({ FILE: src/components/playerDetails/playerDetails.tsx function GenericStat (line 45) | function GenericStat({ function ExtendedStatsViewAsync (line 89) | function ExtendedStatsViewAsync({ function PlayerExtendedStatsView (line 107) | function PlayerExtendedStatsView({ stats }: { stats: PlayerExtendedStats... function fixMaxLevel (line 131) | function fixMaxLevel(level: LevelWithDelta): LevelWithDelta { function MoreStats (line 143) | function MoreStats({ function RiichiStats (line 241) | function RiichiStats({ stats }: { stats: PlayerExtendedStats; metadata: ... function BasicStats (line 343) | function BasicStats({ metadata, hasAdvancedParams }: { metadata: PlayerM... function LuckStats (line 362) | function LuckStats({ stats }: { stats: PlayerExtendedStats }) { function LargestLost (line 408) | function LargestLost({ stats, metadata }: { stats: PlayerExtendedStats; ... function PlayerStats (line 438) | function PlayerStats({ function PlayerDetails (line 494) | function PlayerDetails() { FILE: src/components/playerDetails/playerDetailsSettings.tsx function PlayerDetailsSettings (line 27) | function PlayerDetailsSettings({ showLevel = false, availableModes = [] ... FILE: src/components/playerDetails/sameMatchRate.tsx type RateItem (line 25) | type RateItem = { function TipTable (line 56) | function TipTable({ item }: { item: RateItem }) { function SameMatchRateTable (line 100) | function SameMatchRateTable({ numGames = 100, numDisplay = 12, currentAc... function SameMatchRate (line 213) | function SameMatchRate({ numDisplay = 12, currentAccountId = 0 }) { FILE: src/components/playerDetails/star/starPlayerProvider.tsx type StarredPlayer (line 5) | type StarredPlayer = { method unstarPlayer (line 15) | unstarPlayer(_: PlayerMetadata) {} method starPlayer (line 17) | starPlayer(_: PlayerMetadata) {} method refreshAndGetIsPlayerStarred (line 19) | refreshAndGetIsPlayerStarred(_: PlayerMetadata): boolean { function loadStarredPlayers (line 27) | function loadStarredPlayers() { function saveStarredPlayers (line 32) | function saveStarredPlayers(list: StarredPlayer[]) { function StarPlayerProvider (line 39) | function StarPlayerProvider({ children }: { children: React.ReactNode }) { FILE: src/components/ranking/careerRanking.tsx type ExtraColumnInternal (line 28) | type ExtraColumnInternal = { type ExtraColumn (line 33) | type ExtraColumn = { function RankingTable (line 38) | function RankingTable({ function CareerRankingColumn (line 90) | function CareerRankingColumn({ function CareerRankingPlain (line 141) | function CareerRankingPlain({ function CareerRankingInner (line 161) | function CareerRankingInner({ function CareerRanking (line 195) | function CareerRanking({ FILE: src/components/ranking/deltaRanking.tsx function RankingTable (line 26) | function RankingTable({ rows = [] as DeltaRankingItem[] }) { function DeltaRankingInner (line 50) | function DeltaRankingInner() { function DeltaRanking (line 108) | function DeltaRanking() { FILE: src/components/ranking/index.tsx constant SANMA (line 14) | const SANMA = Conf.rankColors.length === 3; constant ROUTES (line 16) | const ROUTES = ( function Routes (line 207) | function Routes() { FILE: src/components/recentHighlight/index.tsx function buildEventInfo (line 24) | function buildEventInfo({ cellData }: TableCellProps) { constant COLUMN_EVENTINFO (line 69) | const COLUMN_EVENTINFO = makeColumn(() => ( function getEventPlayerId (line 73) | function getEventPlayerId(rec: GameRecord) { function RecentHighlightInner (line 77) | function RecentHighlightInner() { function RecentHighlight (line 110) | function RecentHighlight() { FILE: src/components/routing/subView.tsx type RouteDefProps (line 9) | type RouteDefProps = { type RoutesProps (line 19) | type RoutesProps = { children: React.FunctionComponentElement numbe... function FanStatsView (line 19) | function FanStatsView() { FILE: src/components/statistics/index.tsx constant ROUTES (line 13) | const ROUTES = ( function Routes (line 30) | function Routes() { FILE: src/components/statistics/numPlayerStats.tsx function groupData (line 11) | function groupData( function NumPlayerStats (line 49) | function NumPlayerStats() { FILE: src/components/statistics/rankBySeats.tsx constant SEAT_LABELS (line 13) | const SEAT_LABELS = "东南西北"; function Chart (line 15) | function Chart({ rates, numGames, aspect = 1 }: { rates: RankRates; numG... function RankBySeats (line 29) | function RankBySeats() { FILE: src/data/source/api.ts constant DATA_MIRRORS (line 6) | const DATA_MIRRORS = [ constant PROBE_TIMEOUT (line 12) | const PROBE_TIMEOUT = 15000; function setMaintenanceHandler (line 18) | function setMaintenanceHandler(handler: (msg: string) => void) { function fetchWithTimeout (line 24) | async function fetchWithTimeout( function fetchData (line 40) | async function fetchData(path: string, opts: Parameters[1]... type ApiError (line 96) | type ApiError = Error & { type WithLastModified (line 102) | type WithLastModified = { function handleResponse (line 106) | async function handleResponse(cacheKey: string, resp: Response): Prom... function apiGet (line 151) | async function apiGet(path: string): Promise(path: string, body: unknown): Promise... FILE: src/data/source/misc.ts type PlayerSearchResult (line 13) | type PlayerSearchResult = Pick { function getGlobalHistogram (line 77) | async function getGlobalHistogram(): Promise { function getFanStats (line 80) | async function getFanStats(): Promise { function getRankRateBySeat (line 84) | async function getRankRateBySeat(): Promise { FILE: src/data/source/records/loader.ts constant CHUNK_SIZE (line 9) | const CHUNK_SIZE = 100; type DataLoader (line 11) | interface DataLoader { class DummyDataLoader (line 17) | class DummyDataLoader implements DataLoader { method getMetadata (line 18) | getMetadata(): Promise { method getNextChunk (line 21) | getNextChunk(): Promise { method getEstimatedChunkSize (line 24) | getEstimatedChunkSize(): number { class RecentHighlightDataLoader (line 29) | class RecentHighlightDataLoader implements DataLoader { method constructor (line 32) | constructor(mode: GameMode | undefined, numItems = 100) { method getEstimatedChunkSize (line 53) | getEstimatedChunkSize() { method getMetadata (line 56) | async getMetadata(): Promise { method getNextChunk (line 59) | async getNextChunk(): Promise { class ListingDataLoader (line 66) | class ListingDataLoader implements DataLoader { method constructor (line 70) | constructor(date: dayjs.ConfigType, mode: GameMode | null) { method getEstimatedChunkSize (line 76) | getEstimatedChunkSize() { method shouldReturnEmptyResult (line 79) | shouldReturnEmptyResult() { method getMetadata (line 82) | async getMetadata(): Promise { method getNextChunk (line 88) | async getNextChunk(): Promise { function processExtendedStats (line 106) | function processExtendedStats(stats: PlayerMetadata): (value: PlayerExte... class PlayerDataLoader (line 120) | class PlayerDataLoader implements DataLoader { method constructor (line 128) | constructor(playerId: string, startDate?: dayjs.Dayjs, endDate?: dayjs... method _getDatePath (line 137) | _getDatePath(): string { method _getParams (line 144) | _getParams(mode = this._mode): string { method getEstimatedChunkSize (line 147) | getEstimatedChunkSize() { method getMetadata (line 150) | async getMetadata(): Promise { method getNextChunk (line 185) | async getNextChunk(): Promise { class FilteredPlayerDataLoader (line 206) | class FilteredPlayerDataLoader implements DataLoader { method constructor (line 209) | constructor(private _playerId: string, private _loadRecord: () => Prom... method getEstimatedChunkSize (line 215) | getEstimatedChunkSize() { method getRecords (line 218) | private async getRecords(): Promise { method getMetadata (line 227) | async getMetadata(): Promise { method getNextChunk (line 258) | async getNextChunk(): Promise { class FixedNumberPlayerDataLoader (line 267) | class FixedNumberPlayerDataLoader extends PlayerDataLoader { method constructor (line 270) | constructor(playerId: string, limit: number, mode: GameMode[]) { method getEstimatedChunkSize (line 283) | getEstimatedChunkSize() { method getMetadata (line 286) | async getMetadata(): Promise { method getNextChunk (line 303) | async getNextChunk(): Promise { FILE: src/data/source/records/provider.ts type FilterPredicate (line 16) | type FilterPredicate = ((record: TRecord) => boole... class DataProviderImpl (line 17) | class DataProviderImpl) { method setFilterPredicate (line 38) | setFilterPredicate(predicate: FilterPredicate) { method updateFilteredIndices (line 46) | updateFilteredIndices() { method getMetadataSync (line 73) | getMetadataSync(): TMetadata | null { method getEstimatedCountSync (line 79) | getEstimatedCountSync(): number { method getCountMaybeSync (line 87) | getCountMaybeSync(): number | Promise { method getCount (line 94) | async getCount(): Promise { method getUnfilteredCountSync (line 126) | getUnfilteredCountSync(): number | null { method isItemLoaded (line 133) | isItemLoaded(index: number): boolean { method getItem (line 140) | getItem(index: number, skipPreload = false): TRecord | Promise { type ListingDataProvider (line 215) | type ListingDataProvider = DataProviderImpl; type PlayerDataProvider (line 216) | type PlayerDataProvider = DataProviderImpl; constant DUMMY_DATA_PROVIDER (line 217) | const DUMMY_DATA_PROVIDER = new DataProviderImpl(new DummyData... type DataProvider (line 219) | type DataProvider = ListingDataProvider | PlayerDataProvider; method createListing (line 222) | createListing(date: dayjs.ConfigType, mode: GameMode | null): ListingDat... method createHightlight (line 225) | createHightlight(mode: GameMode | undefined): ListingDataProvider { method createPlayer (line 228) | createPlayer( method createFilteredPlayer (line 247) | createFilteredPlayer(playerId: string, loadRecord: () => Promise(maybePromise: T | Promise, cacheKey?: string): T... function useAsyncFactory (line 64) | function useAsyncFactory( FILE: src/utils/conf.ts constant CONFIGURATIONS (line 7) | const CONFIGURATIONS = { type Configuration (line 89) | type Configuration = typeof CONFIGURATIONS.DEFAULT; function mergeDeep (line 92) | function mergeDeep(...objects: Partial... function canTrackUser (line 132) | function canTrackUser() { FILE: src/utils/index.ts function triggerRelayout (line 5) | function triggerRelayout() { function scrollToTop (line 11) | function scrollToTop() { function useEventCallback (line 30) | function useEventCallback(fn: (...args: T) => void,... function sum (line 49) | function sum(numbers: number[]): number { function useIsMobile (line 53) | function useIsMobile() { FILE: src/utils/notify.tsx function RegisterSnackbarProvider (line 12) | function RegisterSnackbarProvider() { function error (line 25) | function error(message: string, options: Partial = {}) { function networkError (line 44) | function networkError() { FILE: src/utils/preference.ts function savePlayerPreference (line 3) | function savePlayerPreference(key: string, id: string, value: unknown) { function loadPlayerPreference (line 11) | function loadPlayerPreference(key: string, id: string, defaultValue: ... function loadPreference (line 19) | function loadPreference(key: string, defaultValue: T): T { function savePreference (line 23) | function savePreference(key: string, value: unknown) {