Skip to content

Commit

Permalink
feat(react-account): update hooks interface
Browse files Browse the repository at this point in the history
return `transactionHash`
  • Loading branch information
runjuu committed Jul 25, 2023
1 parent 2242013 commit 67c24fa
Show file tree
Hide file tree
Showing 6 changed files with 91 additions and 69 deletions.
13 changes: 9 additions & 4 deletions packages/react-account/src/hooks/use-delete-note.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@ import { deleteNote, siweDeleteNote } from "../apis";

import { createAccountTypeBasedMutationHooks } from "./account-type-based-hooks";

type Result = { transactionHash: string } | null;

export const useDeleteNote = createAccountTypeBasedMutationHooks<
void,
Pick<NoteEntity, "noteId" | "characterId">
Pick<NoteEntity, "noteId" | "characterId">,
Result
>(
{
actionDesc: "Delete Note",
Expand All @@ -20,7 +23,9 @@ export const useDeleteNote = createAccountTypeBasedMutationHooks<
() => ({
async email({ noteId, characterId }, { account }) {
if (characterId === account.characterId) {
await deleteNote({ token: account.token, noteId });
return deleteNote({ token: account.token, noteId });
} else {
return null;
}
},

Expand All @@ -29,9 +34,9 @@ export const useDeleteNote = createAccountTypeBasedMutationHooks<

async action({ characterId, noteId }, { account, siwe, contract }) {
if (siwe && account.characterId === characterId) {
await siweDeleteNote({ siwe, characterId, noteId });
return siweDeleteNote({ siwe, characterId, noteId });
} else {
await contract.note.delete({ characterId, noteId });
return contract.note.delete({ characterId, noteId });
}
},
},
Expand Down
25 changes: 12 additions & 13 deletions packages/react-account/src/hooks/use-post-note-for-note.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,24 @@ import { putNote, siwePutNote } from "../apis";

import { createAccountTypeBasedMutationHooks } from "./account-type-based-hooks";

type Result = { transactionHash: string } | null;
type Variables = {
note: Pick<NoteEntity, "characterId" | "noteId">;
metadata: NoteMetadata;
};

export const usePostNoteForNote = createAccountTypeBasedMutationHooks<
void,
{
note: Pick<NoteEntity, "characterId" | "noteId">;
metadata: NoteMetadata;
},
boolean
Variables,
Result
>(
{
actionDesc: "",
withParams: false,
},
() => ({
async email({ metadata, note }, { account }) {
await putNote({
return putNote({
token: account.token,
metadata,
linkItemType: "Note",
Expand All @@ -31,8 +34,6 @@ export const usePostNoteForNote = createAccountTypeBasedMutationHooks<
noteId: BigInt(note.noteId),
},
});

return true;
},

wallet: {
Expand All @@ -41,7 +42,7 @@ export const usePostNoteForNote = createAccountTypeBasedMutationHooks<
async action({ metadata, note }, { account, siwe, contract }) {
if (account?.characterId) {
if (siwe) {
await siwePutNote({
return siwePutNote({
characterId: account.characterId,
siwe,
metadata,
Expand All @@ -52,17 +53,15 @@ export const usePostNoteForNote = createAccountTypeBasedMutationHooks<
},
});
} else {
await contract.note.postForNote({
return contract.note.postForNote({
characterId: account.characterId,
metadataOrUri: metadata,
targetCharacterId: note.characterId,
targetNoteId: note.noteId,
});
}

return true;
} else {
return false;
return null;
}
},
},
Expand Down
21 changes: 14 additions & 7 deletions packages/react-account/src/hooks/use-post-note.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { createAccountTypeBasedMutationHooks } from "./account-type-based-hooks"
export const usePostNote = createAccountTypeBasedMutationHooks<
void,
{ metadata: NoteMetadata; characterId?: number },
{ noteId: bigint }
{ noteId: bigint; transactionHash: string }
>(
{
actionDesc: "usePostNote",
Expand All @@ -22,9 +22,12 @@ export const usePostNote = createAccountTypeBasedMutationHooks<
);
}

const { data } = await putNote({ token: account.token, metadata });
const { data, transactionHash } = await putNote({
token: account.token,
metadata,
});

return { noteId: BigInt(data.noteId) };
return { noteId: BigInt(data.noteId), transactionHash };
},

wallet: {
Expand All @@ -42,16 +45,20 @@ export const usePostNote = createAccountTypeBasedMutationHooks<
: true;

if (siwe && canUseSiwe) {
const { data } = await siwePutNote({ siwe, characterId, metadata });
const { data, transactionHash } = await siwePutNote({
siwe,
characterId,
metadata,
});

return { noteId: BigInt(data.noteId) };
return { noteId: BigInt(data.noteId), transactionHash };
} else {
const { data } = await contract.note.post({
const { data, transactionHash } = await contract.note.post({
characterId,
metadataOrUri: metadata,
});

return { noteId: data.noteId };
return { noteId: data.noteId, transactionHash };
}
},
},
Expand Down
5 changes: 4 additions & 1 deletion packages/react-account/src/hooks/use-transfer-csb.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,12 @@ export type UseTransferCSBParams = {
amount: bigint;
};

type Result = { transactionHash: string };

export const useTransferCsb = createAccountTypeBasedMutationHooks<
void,
UseTransferCSBParams
UseTransferCSBParams,
Result
>({ actionDesc: "transfer CSB", withParams: false }, () => ({
wallet: {
supportOPSign: false,
Expand Down
66 changes: 36 additions & 30 deletions packages/react-account/src/hooks/use-update-character-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,12 @@ type EditFn = (draft: Draft<CharacterMetadata>) => void;
type Variables =
| { edit: EditFn; characterId: number }
| { metadata: CharacterMetadata; characterId: number };
type Result = { transactionHash: string } | null;

export const useUpdateCharacterMetadata = createAccountTypeBasedMutationHooks<
void,
Variables
Variables,
Result
>({ actionDesc: "setting character metadata", withParams: false }, () => {
async function prepareData(variable: Variables) {
// Make sure character metadata is up-to-date.
Expand All @@ -40,45 +42,49 @@ export const useUpdateCharacterMetadata = createAccountTypeBasedMutationHooks<
}

return {
async email(variables, { account }) {
async email(variables, { account }): Promise<Result> {
const metadata = await prepareData(variables);

if (metadata) {
const { transactionHash } = await updateCharactersMetadata({
token: account.token,
metadata,
});
if (!metadata) return null;

await waitUntilTransactionFinished(transactionHash);
}
const { transactionHash } = await updateCharactersMetadata({
token: account.token,
metadata,
});

await waitUntilTransactionFinished(transactionHash);

return { transactionHash };
},

wallet: {
supportOPSign: true,

async action(variables, { siwe, contract }) {
async action(variables, { siwe, contract }): Promise<Result> {
const metadata = await prepareData(variables);

if (metadata) {
const { transactionHash } = await (() => {
if (siwe) {
return siweUpdateMetadata({
characterId: variables.characterId,
siwe,
metadata,
});
} else {
return contract.character.setMetadata({
characterId: variables.characterId,
// crossbell.js will try to modify the object internally,
// here the immutable object is converted to mutable object to avoid errors.
metadata: JSON.parse(JSON.stringify(metadata)),
});
}
})();

await waitUntilTransactionFinished(transactionHash);
}
if (!metadata) return null;

const { transactionHash } = await (() => {
if (siwe) {
return siweUpdateMetadata({
characterId: variables.characterId,
siwe,
metadata,
});
} else {
return contract.character.setMetadata({
characterId: variables.characterId,
// crossbell.js will try to modify the object internally,
// here the immutable object is converted to mutable object to avoid errors.
metadata: JSON.parse(JSON.stringify(metadata)),
});
}
})();

await waitUntilTransactionFinished(transactionHash);

return { transactionHash };
},
},

Expand Down
30 changes: 16 additions & 14 deletions packages/react-account/src/hooks/use-update-note.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ type Variables =
metadata: NoteMetadata;
note: Pick<NoteEntity, "characterId" | "noteId">;
};
type Result = { transactionHash: string } | null;

const getMetadata = async (variables: Variables) => {
const note = await indexer.note.get(
Expand All @@ -42,45 +43,46 @@ const getMetadata = async (variables: Variables) => {

export const useUpdateNote = createAccountTypeBasedMutationHooks<
void,
Variables
Variables,
Result
>(
{
actionDesc: "useUpdateNote",
withParams: false,
},
() => {
return {
async email(variables, { account }) {
if (variables.note.characterId !== account.characterId) return;
async email(variables, { account }): Promise<Result> {
if (variables.note.characterId !== account.characterId) return null;

const metadata = await getMetadata(variables);

if (metadata) {
await updateNote({
token: account.token,
metadata: metadata,
noteId: variables.note.noteId,
});
}
if (!metadata) return null;

return updateNote({
token: account.token,
metadata: metadata,
noteId: variables.note.noteId,
});
},

wallet: {
supportOPSign: true,

async action(variables, { account, siwe, contract }) {
async action(variables, { account, siwe, contract }): Promise<Result> {
const metadata = await getMetadata(variables);

if (!metadata) return;
if (!metadata) return null;

if (siwe && variables.note.characterId === account.characterId) {
await siweUpdateNote({
return siweUpdateNote({
siwe,
characterId: variables.note.characterId,
noteId: variables.note.noteId,
metadata,
});
} else {
await contract.note.setMetadata({
return contract.note.setMetadata({
characterId: variables.note.characterId,
noteId: variables.note.noteId,
// crossbell.js will try to modify the object internally,
Expand Down

1 comment on commit 67c24fa

@vercel
Copy link

@vercel vercel bot commented on 67c24fa Jul 25, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Successfully deployed to the following URLs:

crossbell-universe – ./

crossbell-universe-git-main-crossbell.vercel.app
crossbell-universe-crossbell.vercel.app
crossbell-dev.vercel.app

Please sign in to comment.