From a5d85962d1999ae6002dee1236c18c2bc7212ddb Mon Sep 17 00:00:00 2001
From: karashiiro <49822414+karashiiro@users.noreply.github.com>
Date: Tue, 5 Jul 2022 16:32:16 -0700
Subject: [PATCH] Minimize useSettings calls (#15)
useSettings refreshes the expiries of all settings cookies each time it
is called, which is a slow operation. This reduces its overuse.
---
components/GameMateria/GameMateria.tsx | 8 +++-----
components/List/ListItem/ListItem.tsx | 12 ++++++++++--
components/List/ListItemHeader/ListItemHeader.tsx | 8 +++-----
components/List/ListItemMarket/ListItemMarket.tsx | 10 +++++-----
components/ListingsTable/ListingsTable.tsx | 5 ++++-
.../Market/MarketDataCenter/MarketDataCenter.tsx | 8 +++++++-
components/Market/MarketWorld/MarketWorld.tsx | 11 +++++------
components/SalesTable/SalesTable.tsx | 11 +++++------
hooks/useSettings.ts | 12 +++++++++---
pages/_app.tsx | 2 +-
pages/list/[listId].tsx | 1 +
pages/market/[itemId].tsx | 9 +++++++--
types/universalis/lang.ts | 1 +
13 files changed, 61 insertions(+), 37 deletions(-)
create mode 100644 types/universalis/lang.ts
diff --git a/components/GameMateria/GameMateria.tsx b/components/GameMateria/GameMateria.tsx
index 802d39f..ecab47f 100644
--- a/components/GameMateria/GameMateria.tsx
+++ b/components/GameMateria/GameMateria.tsx
@@ -1,15 +1,13 @@
import { getItem, getMateria } from '../../data/game';
-import useSettings from '../../hooks/useSettings';
+import { Language } from '../../types/universalis/lang';
interface GameMateriaProps {
materiaId: number;
slotId: number;
+ lang: Language;
}
-export default function GameMateria({ materiaId, slotId }: GameMateriaProps) {
- const [settings] = useSettings();
- const lang = settings['mogboard_language'] ?? 'en';
-
+export default function GameMateria({ materiaId, slotId, lang }: GameMateriaProps) {
const materia = getMateria(materiaId, lang);
if (materia == null) {
return <>>;
diff --git a/components/List/ListItem/ListItem.tsx b/components/List/ListItem/ListItem.tsx
index 754810e..65714dd 100644
--- a/components/List/ListItem/ListItem.tsx
+++ b/components/List/ListItem/ListItem.tsx
@@ -4,6 +4,7 @@ import GameItemIcon from '../../GameItemIcon/GameItemIcon';
import ListItemHeader from '../ListItemHeader/ListItemHeader';
import Tooltip from '../../Tooltip/Tooltip';
import ListItemMarket from '../ListItemMarket/ListItemMarket';
+import { Language } from '../../../types/universalis/lang';
interface ListItemProps {
itemId: number;
@@ -12,6 +13,7 @@ interface ListItemProps {
reqIsOwner: boolean;
showHomeWorld: boolean;
removeItem: (itemId: number) => void;
+ lang: Language;
}
export default function ListItem({
@@ -21,6 +23,7 @@ export default function ListItem({
reqIsOwner,
showHomeWorld,
removeItem,
+ lang,
}: ListItemProps) {
return (
@@ -29,7 +32,7 @@ export default function ListItem({
-
+
{reqIsOwner && (
)}
-
+
);
diff --git a/components/List/ListItemHeader/ListItemHeader.tsx b/components/List/ListItemHeader/ListItemHeader.tsx
index b9da689..6bd4bbe 100644
--- a/components/List/ListItemHeader/ListItemHeader.tsx
+++ b/components/List/ListItemHeader/ListItemHeader.tsx
@@ -1,17 +1,15 @@
import Link from 'next/link';
import { getClassJobCategory, getItemKind, getItemSearchCategory } from '../../../data/game';
-import useSettings from '../../../hooks/useSettings';
import { Item } from '../../../types/game/Item';
+import { Language } from '../../../types/universalis/lang';
import CopyTextButton from '../../CopyTextButton/CopyTextButton';
interface ListItemHeaderProps {
item?: Item;
+ lang: Language;
}
-export default function ListItemHeader({ item }: ListItemHeaderProps) {
- const [settings] = useSettings();
- const lang = settings['mogboard_language'] ?? 'en';
-
+export default function ListItemHeader({ item, lang }: ListItemHeaderProps) {
if (item == null) {
return <>>;
}
diff --git a/components/List/ListItemMarket/ListItemMarket.tsx b/components/List/ListItemMarket/ListItemMarket.tsx
index ae2caac..11c1dc1 100644
--- a/components/List/ListItemMarket/ListItemMarket.tsx
+++ b/components/List/ListItemMarket/ListItemMarket.tsx
@@ -1,8 +1,8 @@
import { t, Trans } from '@lingui/macro';
import RelativeTime from '@yaireo/relative-time';
import { sprintf } from 'sprintf-js';
-import useSettings from '../../../hooks/useSettings';
import { Item } from '../../../types/game/Item';
+import { Language } from '../../../types/universalis/lang';
import ListingsTable from '../../ListingsTable/ListingsTable';
import SalesTable from '../../SalesTable/SalesTable';
@@ -10,12 +10,10 @@ interface ListItemMarketProps {
item?: Item;
market: any;
showHomeWorld: boolean;
+ lang: Language;
}
-export default function ListItemMarket({ item, market, showHomeWorld }: ListItemMarketProps) {
- const [settings] = useSettings();
- const lang = settings['mogboard_language'] ?? 'en';
-
+export default function ListItemMarket({ item, market, showHomeWorld, lang }: ListItemMarketProps) {
if (item == null) {
return ;
}
@@ -40,6 +38,7 @@ export default function ListItemMarket({ item, market, showHomeWorld }: ListItem
averageNq={market.currentAveragePriceNQ}
crossWorld={!showHomeWorld}
includeDiff={false}
+ lang={lang}
start={0}
end={5}
/>
@@ -58,6 +57,7 @@ export default function ListItemMarket({ item, market, showHomeWorld }: ListItem
averageNq={market.averagePriceNQ}
crossWorld={!showHomeWorld}
includeDiff={false}
+ lang={lang}
start={0}
end={5}
/>
diff --git a/components/ListingsTable/ListingsTable.tsx b/components/ListingsTable/ListingsTable.tsx
index dcadca4..519ca5f 100644
--- a/components/ListingsTable/ListingsTable.tsx
+++ b/components/ListingsTable/ListingsTable.tsx
@@ -1,6 +1,7 @@
import { Trans } from '@lingui/macro';
import Image from 'next/image';
import { Fragment, PropsWithChildren } from 'react';
+import { Language } from '../../types/universalis/lang';
import GameCityIcon from '../GameCityIcon/GameCityIcon';
import GameMateria from '../GameMateria/GameMateria';
import SortTable from '../SortTable/SortTable';
@@ -12,6 +13,7 @@ interface ListingsTableProps {
averageHq: number;
crossWorld: boolean;
includeDiff: boolean;
+ lang: Language;
start?: number;
end?: number;
}
@@ -119,6 +121,7 @@ export default function ListingsTable({
averageHq,
crossWorld,
includeDiff,
+ lang,
start,
end,
}: ListingsTableProps) {
@@ -131,7 +134,7 @@ export default function ListingsTable({
hq: listing.hq,
materia: listing.materia.map((m: { materiaID: number; slotID: number }, i: number) => (
-
+
)),
diff --git a/components/Market/MarketDataCenter/MarketDataCenter.tsx b/components/Market/MarketDataCenter/MarketDataCenter.tsx
index 8bc1e1c..843ac2a 100644
--- a/components/Market/MarketDataCenter/MarketDataCenter.tsx
+++ b/components/Market/MarketDataCenter/MarketDataCenter.tsx
@@ -3,6 +3,7 @@ import Image from 'next/image';
import { sprintf } from 'sprintf-js';
import { DataCenter } from '../../../types/game/DataCenter';
import { Item } from '../../../types/game/Item';
+import { Language } from '../../../types/universalis/lang';
import ListingsTable from '../../ListingsTable/ListingsTable';
import SalesTable from '../../SalesTable/SalesTable';
import MarketAverages from '../MarketAverages/MarketAverages';
@@ -15,13 +16,14 @@ interface MarketDataCenterProps {
item: Item;
dc: DataCenter;
markets: Record;
+ lang: Language;
}
function entriesToShow(entries: {}[]) {
return Math.max(Math.floor(entries.length * 0.1), 10);
}
-export default function MarketDataCenter({ item, dc, markets }: MarketDataCenterProps) {
+export default function MarketDataCenter({ item, dc, markets, lang }: MarketDataCenterProps) {
const worldsSorted = dc.worlds.sort((a, b) => a.name.localeCompare(b.name));
if (Object.keys(markets).length !== dc.worlds.length) {
@@ -124,6 +126,7 @@ export default function MarketDataCenter({ item, dc, markets }: MarketDataCenter
averageNq={nqListingsAveragePpu}
crossWorld={true}
includeDiff={true}
+ lang={lang}
start={0}
end={entriesToShow(hqListings)}
/>
@@ -139,6 +142,7 @@ export default function MarketDataCenter({ item, dc, markets }: MarketDataCenter
averageNq={nqListingsAveragePpu}
crossWorld={true}
includeDiff={true}
+ lang={lang}
start={0}
end={entriesToShow(nqListings)}
/>
@@ -156,6 +160,7 @@ export default function MarketDataCenter({ item, dc, markets }: MarketDataCenter
averageNq={nqSalesAveragePpu}
crossWorld={true}
includeDiff={true}
+ lang={lang}
start={0}
end={entriesToShow(hqSales)}
/>
@@ -169,6 +174,7 @@ export default function MarketDataCenter({ item, dc, markets }: MarketDataCenter
averageNq={nqSalesAveragePpu}
crossWorld={true}
includeDiff={true}
+ lang={lang}
start={0}
end={entriesToShow(nqSales)}
/>
diff --git a/components/Market/MarketWorld/MarketWorld.tsx b/components/Market/MarketWorld/MarketWorld.tsx
index 964585c..be1e4c9 100644
--- a/components/Market/MarketWorld/MarketWorld.tsx
+++ b/components/Market/MarketWorld/MarketWorld.tsx
@@ -1,9 +1,8 @@
import { t, Trans } from '@lingui/macro';
import RelativeTime from '@yaireo/relative-time';
-import { useState, useEffect } from 'react';
-import useSettings from '../../../hooks/useSettings';
import { Item } from '../../../types/game/Item';
import { World } from '../../../types/game/World';
+import { Language } from '../../../types/universalis/lang';
import ListingsTable from '../../ListingsTable/ListingsTable';
import SalesTable from '../../SalesTable/SalesTable';
import MarketHistoryGraph from '../MarketHistoryGraph/MarketHistoryGraph';
@@ -14,16 +13,14 @@ interface MarketWorldProps {
item: Item;
world: World;
market: any;
+ lang: Language;
}
function entriesToShow(entries: {}[]) {
return Math.max(Math.floor(entries.length * 0.1), 10);
}
-export default function MarketWorld({ item, world, market }: MarketWorldProps) {
- const [settings] = useSettings();
- const lang = settings['mogboard_language'] ?? 'en';
-
+export default function MarketWorld({ item, world, market, lang }: MarketWorldProps) {
const relativeTime = new RelativeTime({ locale: lang });
if (market == null) {
@@ -62,6 +59,7 @@ export default function MarketWorld({ item, world, market }: MarketWorldProps) {
averageNq={market.currentAveragePriceNQ}
crossWorld={false}
includeDiff={true}
+ lang={lang}
start={0}
end={entriesToShow(market.listings)}
/>
@@ -76,6 +74,7 @@ export default function MarketWorld({ item, world, market }: MarketWorldProps) {
averageNq={market.averagePriceNQ}
crossWorld={false}
includeDiff={true}
+ lang={lang}
start={0}
end={entriesToShow(market.listings)}
/>
diff --git a/components/SalesTable/SalesTable.tsx b/components/SalesTable/SalesTable.tsx
index a74c33c..b7e25c8 100644
--- a/components/SalesTable/SalesTable.tsx
+++ b/components/SalesTable/SalesTable.tsx
@@ -4,7 +4,7 @@ import { PropsWithChildren, Suspense } from 'react';
import SortTable from '../SortTable/SortTable';
import Tooltip from '../Tooltip/Tooltip';
import Image from 'next/image';
-import useSettings from '../../hooks/useSettings';
+import { Language } from '../../types/universalis/lang';
interface SalesTableProps {
sales: any[];
@@ -12,6 +12,7 @@ interface SalesTableProps {
averageNq: number;
crossWorld: boolean;
includeDiff: boolean;
+ lang: Language;
start?: number;
end?: number;
}
@@ -44,10 +45,7 @@ function SalesTableHeader({
);
}
-function SalesTableRow({ sale }: { sale: SaleRow }) {
- const [settings] = useSettings();
- const lang = settings['mogboard_language'] ?? 'en';
-
+function SalesTableRow({ sale, lang }: { sale: SaleRow; lang: Language }) {
const relativeTime = new RelativeTime({ locale: lang });
return (
@@ -106,6 +104,7 @@ export default function SalesTable({
averageNq,
crossWorld,
includeDiff,
+ lang,
start,
end,
}: SalesTableProps) {
@@ -183,7 +182,7 @@ export default function SalesTable({
}
>
- {(sale) => }
+ {(sale) => }
);
diff --git a/hooks/useSettings.ts b/hooks/useSettings.ts
index f6605c6..813a71b 100644
--- a/hooks/useSettings.ts
+++ b/hooks/useSettings.ts
@@ -1,14 +1,20 @@
import { useEffect } from 'react';
import { useCookies } from 'react-cookie';
+import { Language } from '../types/universalis/lang';
-type Settings = {
+interface Settings {
mogboard_server: string;
- mogboard_language: 'en' | 'fr' | 'de' | 'ja' | 'chs';
+ mogboard_language: Language;
mogboard_timezone: string;
mogboard_leftnav: 'on' | 'off';
mogboard_homeworld: 'yes' | 'no';
-};
+}
+/**
+ * Retrieve the user's site settings.
+ * WARNING: This function refreshes the expiry of all settings cookies; this is a relatively *slow* operation!
+ * Try to pass specific values from this where possible, instead of calling it in a deeply-nested loop.
+ */
export default function useSettings(): [
Partial,
(name: keyof Settings, value: any) => void
diff --git a/pages/_app.tsx b/pages/_app.tsx
index 33e9fc0..14982bc 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -20,7 +20,7 @@ import { messages as messagesDe } from '../i18n/de/messages';
import { messages as messagesFr } from '../i18n/fr/messages';
import { messages as messagesZhHans } from '../i18n/zh-HANS/messages';
import App from 'next/app';
-import { useEffect, useState } from 'react';
+import { useState } from 'react';
import { PopupData, PopupProvider } from '../components/UniversalisLayout/components/Popup/Popup';
import {
ModalCoverData,
diff --git a/pages/list/[listId].tsx b/pages/list/[listId].tsx
index 23ef658..6836068 100644
--- a/pages/list/[listId].tsx
+++ b/pages/list/[listId].tsx
@@ -176,6 +176,7 @@ const List: NextPage = ({ dcs, list, reqIsOwner, ownerName }) => {
updateList({ items });
dispatch({ type: 'removeItem', itemId: x });
}}
+ lang={lang}
/>
))}
{stateList.items.length === 0 && (
diff --git a/pages/market/[itemId].tsx b/pages/market/[itemId].tsx
index 3b7266f..e142fbc 100644
--- a/pages/market/[itemId].tsx
+++ b/pages/market/[itemId].tsx
@@ -117,11 +117,16 @@ const Market: NextPage = ({ hasSession, lists, markets, itemId, dc,
-
+
{selectedWorld && (
-
+
)}
diff --git a/types/universalis/lang.ts b/types/universalis/lang.ts
new file mode 100644
index 0000000..1288802
--- /dev/null
+++ b/types/universalis/lang.ts
@@ -0,0 +1 @@
+export type Language = 'ja' | 'en' | 'de' | 'fr' | 'chs';