Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor: inbound link screens, starting with NoteScreen #152

Merged
merged 1 commit into from
Aug 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion apps/daimo-mobile/src/logic/note.ts
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,6 @@ export function useEphemeralSignature(
account: ephemeralAccount,
chain: baseGoerli,
transport: http(),
// TODO: webSocket("wss://base-goerli.public.blastapi.io")
});
const message = keccak256(recipient);
const signature = await ephemeralClient.signMessage({
Expand Down
16 changes: 8 additions & 8 deletions apps/daimo-mobile/src/view/HomeStack.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import { tokenMetadata } from "@daimo/contract";
import { createNativeStackNavigator } from "@react-navigation/native-stack";
import { useMemo } from "react";

import { AccountScreen } from "./screen/AccountScreen";
import { HistoryScreen } from "./screen/History";
import { HistoryOpScreen } from "./screen/HistoryOpScreen";
import HomeScreen from "./screen/HomeScreen";
import OnboardingScreen from "./screen/OnboardingScreen";
import ClaimNoteScreen from "./screen/receive/ClaimNoteScreen";
import { SettingsScreen } from "./screen/SettingsScreen";
import NoteScreen from "./screen/link/NoteScreen";
import CreateRequestScreen from "./screen/receive/CreateRequestScreen";
import DepositScreen from "./screen/receive/DepositScreen";
import RequestScreen from "./screen/receive/RequestScreen";
import RequestSendScreen from "./screen/receive/RequestSendScreen";
import SendRequestScreen from "./screen/receive/SendRequestScreen";
import SendScreen from "./screen/send/SendScreen";
import WithdrawScreen from "./screen/send/WithdrawScreen";
import { HomeStackParamList } from "./shared/nav";
Expand All @@ -30,22 +30,22 @@ export function HomeStackNav() {
options={useMemo(() => ({ headerShown: !!account }), [account])}
/>
<HomeStack.Screen name="Send" component={SendScreen} />
<HomeStack.Screen name="Request" component={RequestScreen} />
<HomeStack.Screen name="Request" component={CreateRequestScreen} />
<HomeStack.Screen
name="History"
component={HistoryScreen}
options={useMemo(() => ({ animation: "slide_from_bottom" }), [])}
/>
</HomeStack.Group>
<HomeStack.Group screenOptions={{ presentation: "modal" }}>
<HomeStack.Screen name="Account" component={AccountScreen} />
<HomeStack.Screen name="Settings" component={SettingsScreen} />
<HomeStack.Screen name="Deposit" component={DepositScreen} />
<HomeStack.Screen name="Withdraw" component={WithdrawScreen} />
<HomeStack.Screen name="Note" component={ClaimNoteScreen} />
<HomeStack.Screen name="Note" component={NoteScreen} />
<HomeStack.Screen
name="RequestSend"
options={{ headerTitle: `Request ${tokenMetadata.symbol}` }}
component={RequestSendScreen}
component={SendRequestScreen}
/>
<HomeStack.Screen name="HistoryOp" component={HistoryOpScreen} />
</HomeStack.Group>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import { useNav } from "../shared/nav";
import { color, ss } from "../shared/style";
import { TextBody, TextBold, TextH2, TextH3, TextLight } from "../shared/text";

export function AccountScreen() {
export function SettingsScreen() {
const [account, setAccount] = useAccount();
const nav = useNav();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ import { NativeStackScreenProps } from "@react-navigation/native-stack";
import { ReactNode, useEffect, useState } from "react";
import { ActivityIndicator, ScrollView, StyleSheet, View } from "react-native";
import { Address } from "viem";
import { privateKeyToAccount } from "viem/accounts";

import { SendOpFn, useSendAsync } from "../../../action/useSendAsync";
import {
Expand All @@ -28,17 +27,14 @@ import { TextCenter, TextError, TextLight } from "../../shared/text";

type Props = NativeStackScreenProps<HomeStackParamList, "Note">;

export default function ClaimNoteScreen({ route }: Props) {
export default function NoteScreen({ route }: Props) {
const [account] = useAccount();
assert(account != null);

const { ephemeralPrivateKey, ephemeralOwner: passedEphemeralOwner } =
route.params || {};
const ephemeralOwner =
passedEphemeralOwner || privateKeyToAccount(ephemeralPrivateKey!).address;

const { ephemeralPrivateKey, ephemeralOwner } = route.params;
console.log(`[NOTE] rendering note ${ephemeralOwner}`);

// TODO: delete useFetchNote etc, use rpcFunc.getLinkStatus
const [note, loadState] = useFetchNote(ephemeralOwner);

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import { useNav } from "../../shared/nav";
import { ss } from "../../shared/style";
import { TextLight } from "../../shared/text";

export default function RequestScreen() {
export default function CreateRequestScreen() {
const nav = useNav();
const send = useCallback(() => nav.navigate("RequestSend"), [nav]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { AmountInput } from "../../shared/Input";
import { useNav } from "../../shared/nav";
import { color } from "../../shared/style";

export default function RequestSendScreen() {
export default function SendRequestScreen() {
const [account] = useAccount();
assert(account != null);
const [dollars, setDollars] = useState(0);
Expand Down
2 changes: 1 addition & 1 deletion apps/daimo-mobile/src/view/shared/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { useAccount } from "../../model/account";

export function Header() {
const nav = useNav();
const goToAccount = useCallback(() => nav.navigate("Account"), [nav]);
const goToAccount = useCallback(() => nav.navigate("Settings"), [nav]);

const [account] = useAccount();

Expand Down
22 changes: 9 additions & 13 deletions apps/daimo-mobile/src/view/shared/nav.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
import { DaimoLink, parseDaimoLink, OpEvent } from "@daimo/common";
import {
DaimoLink,
DaimoLinkNote,
OpEvent,
parseDaimoLink,
} from "@daimo/common";
import { useNavigation } from "@react-navigation/native";
import type { NativeStackNavigationProp } from "@react-navigation/native-stack";
import { useURL } from "expo-linking";
import { useEffect } from "react";
import { Address } from "viem";

import { Recipient, getRecipient } from "../../sync/recipients";

export type HomeStackParamList = {
Home: undefined;
Account: undefined;
Settings: undefined;
Chain: undefined;
Send: undefined | { recipient: Recipient; dollars?: number };
Withdraw: undefined;
Request: undefined;
Deposit: undefined;
Note:
| undefined
| {
ephemeralPrivateKey: `0x${string}` | undefined;
ephemeralOwner: Address | undefined;
};
Note: DaimoLinkNote;
RequestSend: undefined;
History: undefined;
HistoryOp: { op: OpEvent };
Expand Down Expand Up @@ -62,10 +61,7 @@ async function goTo(nav: ReturnType<typeof useNav>, link: DaimoLink) {
break;
}
case "note": {
nav.navigate("Note", {
ephemeralPrivateKey: link.ephemeralPrivateKey,
ephemeralOwner: link.ephemeralOwner,
});
nav.navigate("Note", link);
break;
}
default:
Expand Down
28 changes: 3 additions & 25 deletions packages/daimo-api/src/router.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
import {
DaimoRequestStatus,
DAccount,
DaimoRequestStatus,
TransferLogSummary,
hasAccountName,
parseDaimoLink,
zAddress,
zHex,
hasAccountName,
} from "@daimo/common";
import { DaimoAccount } from "@daimo/userop";
import { Address, PublicClient, Transport, getAddress } from "viem";
Expand Down Expand Up @@ -132,30 +132,8 @@ export function createRouter(
})
)
.query(async (opts) => {
const ret = null as DAccount | null;
// TODO: lookup account by signing key
// Doing this efficiently likely requires an AddKey event
// Alternately, an indexer contract thru which all accounts are deployed
let ret = null as DAccount | null;

// Stub to test client
if (
opts.input.pubKeyHex ===
"0x3059301306072a8648ce3d020106082a8648ce3d03010703420004fea4465280cfcb1e1b77a91525ca90dfdd213705b6eac7bc7a79931af4e0cfe7464564a11e15252f840d73da0d34fddb74ebe806e93840f3c208e68d620d7376"
) {
ret = {
name: "test",
addr: "0xa3449c3f57af6d39bc9eb41d6e0b75d3723210cd",
};
} else if (
opts.input.pubKeyHex ===
`0x3059301306072a8648ce3d020106082a8648ce3d0301070342000436dff9029e718c4c7da071077a53a987569ecc780f92203e26afc7b91e1362582ce0bfc65b7cef65dff64768978e691eca8576da6f9d387fe77c70eeaed26f33`
) {
ret = {
name: "jules",
addr: "0xbfbff790707f8a9bddae662985270df58011cd9c",
};
}

console.log(
`[API] lookup found ${ret?.name || "<no account>"} for pubkey ${
opts.input.pubKeyHex
Expand Down
16 changes: 9 additions & 7 deletions packages/daimo-common/src/daimoLink.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,15 +31,17 @@ export type DaimoLinkNote = {

export function formatDaimoLink(link: DaimoLink) {
switch (link.type) {
case "account":
case "account": {
return `${daimoLinkBase}/account/${link.addr}`;
case "request":
}
case "request": {
return `${daimoLinkBase}/request/${link.recipient}/${link.dollars}`;
case "note":
if (link.ephemeralPrivateKey == null) {
return `${daimoLinkBase}/note/${link.ephemeralOwner}`;
}
return `${daimoLinkBase}/note/${link.ephemeralOwner}#${link.ephemeralPrivateKey}`;
}
case "note": {
const base = `${daimoLinkBase}/note/${link.ephemeralOwner}`;
const hash = link.ephemeralPrivateKey && `#${link.ephemeralPrivateKey}`;
return `${base}${hash || ""}`;
}
}
}

Expand Down