Skip to content
This repository was archived by the owner on Feb 8, 2025. It is now read-only.

Commit e17dace

Browse files
authored
Merge pull request #264 from zallo-labs/Z-305-fix-linking-token-not-found
Z 305 fix linking token not found
2 parents 7f952c9 + 9bb75a3 commit e17dace

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

52 files changed

+210
-138
lines changed
Binary file not shown.

app/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
"immer": "^10.1.1",
9393
"isows": "^1.0.4",
9494
"jotai": "^2.8.4",
95+
"jotai-effect": "^1.0.0",
9596
"jotai-immer": "^0.4.1",
9697
"jwt-decode": "^4.0.0",
9798
"lib": "workspace:*",

app/src/api/environment.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,11 @@ export async function getEnvironment({ key, approver, persist }: EnvironmentConf
4343
if (environment) return environment;
4444

4545
const store = new Store(recordSource, {
46-
gcReleaseBufferSize: 100, // gc exempt queries
47-
queryCacheExpirationTime: 10 * 60_000,
46+
gcReleaseBufferSize: 100, // Queries not retained excluded from GC
4847
gcScheduler: (run) => {
4948
InteractionManager.runAfterInteractions(run);
5049
},
5150
});
52-
// persist && store.notify(undefined, true); // Invalidate persisted data
5351

5452
const network = createNetworkLayer({
5553
store,

app/src/api/index.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export * from './environment';
2-
export * from './useMutation';
2+
export * from './useLazyQuery';
3+
export * from './useMutation';

app/src/api/useLazyQuery.ts

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { useLazyLoadQuery } from 'react-relay';
2+
import {
3+
GraphQLTaggedNode,
4+
OperationType,
5+
VariablesOf,
6+
getRequest,
7+
createOperationDescriptor,
8+
} from 'relay-runtime';
9+
import {
10+
useSetRequestLastFetched,
11+
useTtlFetchPolicy,
12+
useTtlLastUpdated,
13+
} from './useTtlFetchPolicy';
14+
import { useEffect } from 'react';
15+
16+
export type QueryOptions = Parameters<typeof useLazyLoadQuery>[2];
17+
18+
export function useLazyQuery<TQuery extends OperationType>(
19+
gqlQuery: GraphQLTaggedNode,
20+
variables: VariablesOf<TQuery>,
21+
options?: QueryOptions,
22+
): TQuery['response'] {
23+
const descriptor = createOperationDescriptor(
24+
getRequest(gqlQuery),
25+
variables,
26+
options?.networkCacheConfig,
27+
);
28+
const requestId = descriptor.request.identifier;
29+
30+
const query = useLazyLoadQuery<TQuery>(gqlQuery, variables, {
31+
fetchPolicy: useTtlFetchPolicy(requestId),
32+
fetchKey: useTtlLastUpdated(),
33+
...options,
34+
});
35+
36+
const setLastFetched = useSetRequestLastFetched(requestId);
37+
useEffect(() => {
38+
// Query is only fetched once per mount of a unique request
39+
setLastFetched(Date.now());
40+
}, [setLastFetched, requestId]);
41+
42+
return query;
43+
}

app/src/api/useQuery.ts

-36
This file was deleted.

app/src/api/useTtlFetchPolicy.ts

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { atom, useAtomValue, useSetAtom } from 'jotai';
2+
import { atomFamily } from 'jotai/utils';
3+
import { FetchPolicy } from 'relay-runtime';
4+
import { RequestIdentifier } from 'relay-runtime/lib/util/getRequestIdentifier';
5+
import { atomEffect } from 'jotai-effect';
6+
7+
const TTL = 5 * 60_000;
8+
const ttlLastUpdated = atom(Date.now());
9+
export function useTtlLastUpdated() {
10+
return useAtomValue(ttlLastUpdated);
11+
}
12+
13+
const updateTtlEffect = atomEffect((get, set) => {
14+
// Update TTL immediately if it's been more than TTL since last update
15+
if (get.peek(ttlLastUpdated) < Date.now() - TTL) set(ttlLastUpdated, Date.now());
16+
17+
const timer = setInterval(() => {
18+
set(ttlLastUpdated, Date.now());
19+
}, TTL);
20+
21+
return () => clearInterval(timer);
22+
});
23+
24+
const requestLastFetched = atomFamily((_requestId: RequestIdentifier) => atom<number>(0));
25+
26+
export function useSetRequestLastFetched(id: RequestIdentifier) {
27+
return useSetAtom(requestLastFetched(id));
28+
}
29+
30+
const requestFetchPolicy = atomFamily((requestId: RequestIdentifier) =>
31+
atom((get): FetchPolicy => {
32+
const lastFetched = get(requestLastFetched(requestId));
33+
34+
const lastUpdated = get(ttlLastUpdated);
35+
get(updateTtlEffect);
36+
37+
return lastFetched < lastUpdated - TTL ? 'store-and-network' : 'store-or-network';
38+
}),
39+
);
40+
41+
export function useTtlFetchPolicy(id: RequestIdentifier) {
42+
return useAtomValue(requestFetchPolicy(id));
43+
}

app/src/app/(modal)/[account]/receive.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { Button } from '#/Button';
44
import { QrModal } from '#/QrModal';
55
import { useLocalParams } from '~/hooks/useLocalParams';
66
import { graphql } from 'relay-runtime';
7-
import { useLazyLoadQuery } from 'react-relay';
7+
import { useLazyQuery } from '~/api';
88
import { receive_ReceiveModalQuery } from '~/api/__generated__/receive_ReceiveModalQuery.graphql';
99
import { useRequestTokens } from '~/hooks/mutations/useRequestTokens';
1010

@@ -20,7 +20,7 @@ export default function ReceiveModal() {
2020
const { account } = useLocalParams(AccountParams);
2121
const requestTokens = useRequestTokens();
2222

23-
const { requestableTokens } = useLazyLoadQuery<receive_ReceiveModalQuery>(Query, {
23+
const { requestableTokens } = useLazyQuery<receive_ReceiveModalQuery>(Query, {
2424
account,
2525
});
2626

app/src/app/(modal)/accounts/join.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,11 @@ import { useMemo } from 'react';
1414
import { View } from 'react-native';
1515
import { Switch, Text } from 'react-native-paper';
1616
import QRCode from 'react-native-qrcode-svg';
17-
import { useLazyLoadQuery, useSubscription } from 'react-relay';
17+
import { useSubscription } from 'react-relay';
1818
import { graphql } from 'relay-runtime';
1919
import { Subject } from 'rxjs';
2020
import { z } from 'zod';
21+
import { useLazyQuery } from '~/api';
2122
import { join_JoinAccountModalQuery } from '~/api/__generated__/join_JoinAccountModalQuery.graphql';
2223
import { join_JoinAccountModalSubscription } from '~/api/__generated__/join_JoinAccountModalSubscription.graphql';
2324
import { useScanAddress } from '~/app/scan';
@@ -65,7 +66,7 @@ function JoinAccountModal() {
6566

6667
const setPersonal = (v: boolean) => router.setParams({ personal: v ? 'true' : 'false' });
6768

68-
const { user } = useLazyLoadQuery<join_JoinAccountModalQuery>(Query, {});
69+
const { user } = useLazyQuery<join_JoinAccountModalQuery>(Query, {});
6970
const linkingToken = useLinkingTokenUrl({ user });
7071
const value = personal ? linkingToken : approver;
7172

app/src/app/(nav)/[account]/(home)/activity/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { NoActivity } from '#/activity/NoActivity';
2121
import { ListHeader } from '#/list/ListHeader';
2222
import { DateTime } from 'luxon';
2323
import { graphql } from 'relay-runtime';
24-
import { useLazyLoadQuery } from 'react-relay';
24+
import { useLazyQuery } from '~/api';
2525
import {
2626
activity_ActivityPaneQuery,
2727
activity_ActivityPaneQuery$data,
@@ -64,7 +64,7 @@ function ActivityPane_() {
6464
const { styles } = useStyles(stylesheet);
6565
const { account } = useLocalParams(AccountParams);
6666

67-
const { account: a, user } = useLazyLoadQuery<activity_ActivityPaneQuery>(Query, { account });
67+
const { account: a, user } = useLazyQuery<activity_ActivityPaneQuery>(Query, { account });
6868

6969
const items = [...(a?.proposals ?? []), ...(a?.transfers ?? [])]
7070
.map((v) => ({ ...v, section: getItemSection(v), timestamp: asDateTime(v.timestamp) }))

app/src/app/(nav)/[account]/(home)/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@ import { FlatList, View } from 'react-native';
1616
import { CORNER } from '@theme/paper';
1717
import { ITEM_LIST_GAP } from '#/layout/ItemList';
1818
import { graphql } from 'relay-runtime';
19-
import { useLazyLoadQuery } from 'react-relay';
2019
import { HomePaneQuery } from '~/api/__generated__/HomePaneQuery.graphql';
20+
import { useLazyQuery } from '~/api/useLazyQuery';
2121

2222
const Query = graphql`
2323
query HomePaneQuery($account: UAddress!, $chain: Chain!) {
@@ -49,7 +49,7 @@ function HomePane_() {
4949
const { styles } = useStyles(stylesheet);
5050
const address = useLocalParams(AccountParams).account;
5151
const chain = asChain(address);
52-
const { account, user, tokens } = useLazyLoadQuery<HomePaneQuery>(Query, {
52+
const { account, user, tokens } = useLazyQuery<HomePaneQuery>(Query, {
5353
account: address,
5454
chain,
5555
});

app/src/app/(nav)/[account]/_layout.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { AppbarHeader } from '#/Appbar/AppbarHeader';
1313
import { withSuspense } from '#/skeleton/withSuspense';
1414
import { Splash } from '#/Splash';
1515
import { graphql } from 'relay-runtime';
16-
import { useLazyLoadQuery } from 'react-relay';
16+
import { useLazyQuery } from '~/api';
1717
import { Layout_AccountLayoutQuery } from '~/api/__generated__/Layout_AccountLayoutQuery.graphql';
1818

1919
// Must use Query.accounts to avoid potential redirect loop with LandingScreen
@@ -37,7 +37,7 @@ export function AccountLayout() {
3737
const params = useLocalSearchParams();
3838
const router = useRouter();
3939

40-
const found = !!useLazyLoadQuery<Layout_AccountLayoutQuery>(Query, {}).accounts.find(
40+
const found = !!useLazyQuery<Layout_AccountLayoutQuery>(Query, {}).accounts.find(
4141
(a) => a.address === account,
4242
);
4343

app/src/app/(nav)/[account]/send.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import { ScrollableScreenSurface } from '#/layout/ScrollableScreenSurface';
2222
import Decimal from 'decimal.js';
2323
import { ampli } from '~/lib/ampli';
2424
import { graphql } from 'relay-runtime';
25-
import { useLazyLoadQuery } from 'react-relay';
25+
import { useLazyQuery } from '~/api';
2626
import { send_SendScreenQuery } from '~/api/__generated__/send_SendScreenQuery.graphql';
2727

2828
const Query = graphql`
@@ -62,7 +62,7 @@ function SendScreen() {
6262
const selectToken = useSelectToken();
6363
const selectedToken = useSelectedToken(chain);
6464

65-
const { token, account } = useLazyLoadQuery<send_SendScreenQuery>(Query, {
65+
const { token, account } = useLazyQuery<send_SendScreenQuery>(Query, {
6666
account: accountAddress,
6767
token: selectedToken,
6868
});

app/src/app/(nav)/[account]/settings/approver/[address].tsx

+3-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { useSetAtom } from 'jotai';
1818
import { ApproverPolicies } from '#/approver/ApproverPolicies';
1919
import { Scrollable } from '#/Scrollable';
2020
import { graphql } from 'relay-runtime';
21-
import { useLazyLoadQuery } from 'react-relay';
21+
import { useLazyQuery } from '~/api';
2222
import { Address_ApproverSettingsQuery } from '~/api/__generated__/Address_ApproverSettingsQuery.graphql';
2323
import { asChain } from 'lib';
2424
import { ScreenSkeleton } from '#/skeleton/ScreenSkeleton';
@@ -55,7 +55,7 @@ function ApproverSettingsScreen() {
5555
const { address } = params;
5656
const showSheet = useSetAtom(SIDE_SHEET);
5757

58-
const { account, approver, user } = useLazyLoadQuery<Address_ApproverSettingsQuery>(Query, {
58+
const { account, approver, user } = useLazyQuery<Address_ApproverSettingsQuery>(Query, {
5959
account: params.account,
6060
approver: address,
6161
});
@@ -126,4 +126,4 @@ const styles = createStyles({
126126

127127
export default withSuspense(ApproverSettingsScreen, <ScreenSkeleton />);
128128

129-
export { ErrorBoundary } from '#/ErrorBoundary';
129+
export { ErrorBoundary } from '#/ErrorBoundary';

app/src/app/(nav)/[account]/settings/details.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { AccountNameFormField } from '#/fields/AccountNameFormField';
1010
import { Actions } from '#/layout/Actions';
1111
import { FormSubmitButton } from '#/fields/FormSubmitButton';
1212
import { graphql } from 'relay-runtime';
13-
import { useLazyLoadQuery } from 'react-relay';
13+
import { useLazyQuery } from '~/api';
1414
import { details_AccountDetailsQuery } from '~/api/__generated__/details_AccountDetailsQuery.graphql';
1515
import { useMutation } from '~/api';
1616
import { details_AccountDetailsMutation } from '~/api/__generated__/details_AccountDetailsMutation.graphql';
@@ -42,7 +42,7 @@ export default function AccountDetails() {
4242
const { account } = useLocalParams(AccountSettingsParams);
4343
const update = useMutation<details_AccountDetailsMutation>(Update);
4444

45-
const a = useLazyLoadQuery<details_AccountDetailsQuery>(Query, { account }).account;
45+
const a = useLazyQuery<details_AccountDetailsQuery>(Query, { account }).account;
4646

4747
const { control, handleSubmit, reset } = useForm<Inputs>({ defaultValues: { name: a?.name } });
4848

app/src/app/(nav)/[account]/settings/index.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { PolicyPresetKey } from '~/lib/policy/usePolicyPresets';
2121
import { UPGRADE_APPROVER } from 'lib';
2222
import { MenuOrSearchIcon } from '#/Appbar/MenuOrSearchIcon';
2323
import { graphql } from 'relay-runtime';
24-
import { useLazyLoadQuery } from 'react-relay';
24+
import { useLazyQuery } from '~/api';
2525
import { settings_AccountSettingsQuery } from '~/api/__generated__/settings_AccountSettingsQuery.graphql';
2626

2727
const Query = graphql`
@@ -66,7 +66,7 @@ function AccountSettingsPane_() {
6666
const path = usePath();
6767
const currentRouteParams = useRouteInfo().params;
6868

69-
const { account: a, user } = useLazyLoadQuery<settings_AccountSettingsQuery>(Query, { account });
69+
const { account: a, user } = useLazyQuery<settings_AccountSettingsQuery>(Query, { account });
7070

7171
const approvers = a.approvers.filter(
7272
(approver) => approver.address !== UPGRADE_APPROVER[a.chain],

app/src/app/(nav)/[account]/settings/policy/[id].tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { PolicyDraft, PolicyDraftContext, policyAsDraft } from '~/lib/policy/pol
1010
import { atom } from 'jotai';
1111
import { PolicyPane } from '#/policy/PolicyPane';
1212
import { graphql } from 'relay-runtime';
13-
import { useLazyLoadQuery } from 'react-relay';
13+
import { useLazyQuery } from '~/api';
1414
import { Id_PolicyScreenQuery } from '~/api/__generated__/Id_PolicyScreenQuery.graphql';
1515

1616
const Query = graphql`
@@ -52,7 +52,7 @@ function PolicyScreen() {
5252
const params = useLocalParams(PolicyScreenParams);
5353
const id = params.id !== 'add' ? params.id : undefined;
5454

55-
const { account, policy, user } = useLazyLoadQuery<Id_PolicyScreenQuery>(Query, {
55+
const { account, policy, user } = useLazyQuery<Id_PolicyScreenQuery>(Query, {
5656
account: params.account,
5757
policy: id ?? ZERO_UUID,
5858
includePolicy: !!id,

app/src/app/(nav)/[account]/swap.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { showError } from '#/provider/SnackbarProvider';
2929
import { estimateSwap } from '~/util/swap/syncswap/estimate';
3030
import { ScreenSkeleton } from '#/skeleton/ScreenSkeleton';
3131
import { graphql } from 'relay-runtime';
32-
import { useLazyLoadQuery } from 'react-relay';
32+
import { useLazyQuery } from '~/api';
3333
import { swap_SwapScreenQuery } from '~/api/__generated__/swap_SwapScreenQuery.graphql';
3434

3535
const DownArrow = materialCommunityIcon('arrow-down-thin');
@@ -68,7 +68,7 @@ function SwapScreen() {
6868
const selectToken = useSelectToken();
6969
const swappableTokens = useSwappableTokens(chain);
7070

71-
const query = useLazyLoadQuery<swap_SwapScreenQuery>(Query, {
71+
const query = useLazyQuery<swap_SwapScreenQuery>(Query, {
7272
account,
7373
tokens: swappableTokens,
7474
});

app/src/app/(nav)/[account]/tokens.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { ScreenSurface } from '#/layout/ScreenSurface';
1515
import { MenuOrSearchIcon } from '#/Appbar/MenuOrSearchIcon';
1616
import { graphql } from 'relay-runtime';
1717
import { tokens_TokensScreenQuery } from '~/api/__generated__/tokens_TokensScreenQuery.graphql';
18-
import { useLazyLoadQuery } from 'react-relay';
18+
import { useLazyQuery } from '~/api';
1919

2020
const Query = graphql`
2121
query tokens_TokensScreenQuery($account: UAddress!, $chain: Chain, $query: String) {
@@ -36,7 +36,7 @@ function TokensScreen() {
3636

3737
const [query, setQuery] = useState('');
3838

39-
const { tokens } = useLazyLoadQuery<tokens_TokensScreenQuery>(Query, {
39+
const { tokens } = useLazyQuery<tokens_TokensScreenQuery>(Query, {
4040
account,
4141
chain: asChain(account),
4242
query: query || null,

0 commit comments

Comments
 (0)