Skip to content
Draft
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
50 changes: 50 additions & 0 deletions packages/db-react/src/options-bookmark-transaction.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import type { Signature } from '@solana/kit'
import { type MutateOptions, mutationOptions, queryOptions } from '@tanstack/react-query'
import { bookmarkTransactionFindBySignature } from '@workspace/db/bookmark-transaction/bookmark-transaction-find-by-signature'
import { bookmarkTransactionFindMany } from '@workspace/db/bookmark-transaction/bookmark-transaction-find-many'
import type { BookmarkTransactionFindManyInput } from '@workspace/db/bookmark-transaction/bookmark-transaction-find-many-input'
import { bookmarkTransactionToggle } from '@workspace/db/bookmark-transaction/bookmark-transaction-toggle'
import { bookmarkTransactionUpdate } from '@workspace/db/bookmark-transaction/bookmark-transaction-update'
import type { BookmarkTransactionUpdateInput } from '@workspace/db/bookmark-transaction/bookmark-transaction-update-input'
import { db } from '@workspace/db/db'
import { queryClient } from './query-client.tsx'

export type BookmarkTransactionToggleMutateOptions = MutateOptions<
'created' | 'deleted',
Error,
{ signature: Signature }
>
export type BookmarkTransactionUpdateMutateOptions = MutateOptions<
number,
Error,
{ signature: Signature; input: BookmarkTransactionUpdateInput }
>
export const optionsBookmarkTransaction = {
findBySignature: (signature: Signature) =>
queryOptions({
queryFn: () => bookmarkTransactionFindBySignature(db, signature),
queryKey: ['bookmarkTransactionFindBySignature', signature],
}),
findMany: (input: BookmarkTransactionFindManyInput) =>
queryOptions({
queryFn: () => bookmarkTransactionFindMany(db, input),
queryKey: ['bookmarkTransactionFindMany', input],
}),
toggle: (props: BookmarkTransactionToggleMutateOptions) =>
mutationOptions({
mutationFn: ({ signature }: { signature: Signature }) => bookmarkTransactionToggle(db, signature),
onSuccess: (_, { signature }) => {
queryClient.invalidateQueries(optionsBookmarkTransaction.findBySignature(signature))
},
...props,
}),
update: (props: BookmarkTransactionUpdateMutateOptions = {}) =>
mutationOptions({
mutationFn: ({ id, input }: { id: string; signature: Signature; input: BookmarkTransactionUpdateInput }) =>
bookmarkTransactionUpdate(db, id, input),
onSuccess: (_, { signature }) => {
queryClient.invalidateQueries(optionsBookmarkTransaction.findBySignature(signature))
},
...props,
}),
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import type { Signature } from '@solana/kit'
import { useQuery } from '@tanstack/react-query'
import { optionsBookmarkTransaction } from './options-bookmark-transaction.tsx'

export function useBookmarkTransactionFindBySignature({ signature }: { signature: Signature }) {
return useQuery(optionsBookmarkTransaction.findBySignature(signature))
}
7 changes: 7 additions & 0 deletions packages/db-react/src/use-bookmark-transaction-find-many.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { useQuery } from '@tanstack/react-query'
import type { BookmarkTransactionFindManyInput } from '@workspace/db/bookmark-transaction/bookmark-transaction-find-many-input'
import { optionsBookmarkTransaction } from './options-bookmark-transaction.tsx'

export function useBookmarkTransactionFindMany({ input }: { input: BookmarkTransactionFindManyInput }) {
return useQuery(optionsBookmarkTransaction.findMany(input))
}
13 changes: 13 additions & 0 deletions packages/db-react/src/use-bookmark-transaction-live.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import type { BookmarkTransaction } from '@workspace/db/bookmark-transaction/bookmark-transaction'
import { bookmarkTransactionFindMany } from '@workspace/db/bookmark-transaction/bookmark-transaction-find-many'
import type { BookmarkTransactionFindManyInput } from '@workspace/db/bookmark-transaction/bookmark-transaction-find-many-input'
import { db } from '@workspace/db/db'
import { useLiveQuery } from 'dexie-react-hooks'

export function useBookmarkTransactionLive(input: BookmarkTransactionFindManyInput = {}) {
return useLiveQuery<BookmarkTransaction[], BookmarkTransaction[]>(
() => bookmarkTransactionFindMany(db, input),
[input],
[],
)
}
9 changes: 9 additions & 0 deletions packages/db-react/src/use-bookmark-transaction-toggle.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { useMutation } from '@tanstack/react-query'
import {
type BookmarkTransactionToggleMutateOptions,
optionsBookmarkTransaction,
} from './options-bookmark-transaction.tsx'

export function useBookmarkTransactionToggle(props: BookmarkTransactionToggleMutateOptions = {}) {
return useMutation(optionsBookmarkTransaction.toggle(props))
}
9 changes: 9 additions & 0 deletions packages/db-react/src/use-bookmark-transaction-update.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { useMutation } from '@tanstack/react-query'
import {
type BookmarkTransactionUpdateMutateOptions,
optionsBookmarkTransaction,
} from './options-bookmark-transaction.tsx'

export function useBookmarkTransactionUpdate(props: BookmarkTransactionUpdateMutateOptions = {}) {
return useMutation(optionsBookmarkTransaction.update(props))
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { z } from 'zod'

import type { bookmarkTransactionCreateSchema } from './bookmark-transaction-create-schema.ts'

export type BookmarkTransactionCreateInput = z.infer<typeof bookmarkTransactionCreateSchema>
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { bookmarkTransactionSchema } from './bookmark-transaction-schema.ts'

export const bookmarkTransactionCreateSchema = bookmarkTransactionSchema.omit({
createdAt: true,
id: true,
updatedAt: true,
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { tryCatch } from '@workspace/core/try-catch'

import type { Database } from '../database.ts'
import { randomId } from '../random-id.ts'
import type { BookmarkTransactionCreateInput } from './bookmark-transaction-create-input.ts'
import { bookmarkTransactionCreateSchema } from './bookmark-transaction-create-schema.ts'

export async function bookmarkTransactionCreate(db: Database, input: BookmarkTransactionCreateInput): Promise<string> {
const now = new Date()
const parsedInput = bookmarkTransactionCreateSchema.parse(input)

return db.transaction('rw', db.bookmarkTransactions, async () => {
const { data, error } = await tryCatch(
db.bookmarkTransactions.add({
...parsedInput,
createdAt: now,
id: randomId(),
updatedAt: now,
}),
)
if (error) {
console.log(error)
throw new Error(`Error creating bookmark transaction`)
}

return data
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { tryCatch } from '@workspace/core/try-catch'

import type { Database } from '../database.ts'

export async function bookmarkTransactionDelete(db: Database, id: string): Promise<void> {
const { data, error } = await tryCatch(db.bookmarkTransactions.delete(id))
if (error) {
console.log(error)
throw new Error(`Error deleting bookmark transaction with id ${id}`)
}
return data
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import type { Signature } from '@solana/kit'
import { tryCatch } from '@workspace/core/try-catch'
import type { Database } from '../database.ts'
import type { BookmarkTransaction } from './bookmark-transaction.ts'

export async function bookmarkTransactionFindBySignature(
db: Database,
signature: Signature,
): Promise<null | BookmarkTransaction> {
const { data, error } = await tryCatch(db.bookmarkTransactions.get({ signature }))
if (error) {
console.log(error)
throw new Error(`Error finding bookmark transaction with signature ${signature}`)
}
return data ? data : null
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { z } from 'zod'

import type { bookmarkTransactionFindManySchema } from './bookmark-transaction-find-many-schema.ts'

export type BookmarkTransactionFindManyInput = z.infer<typeof bookmarkTransactionFindManySchema>
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import { bookmarkTransactionSchema } from './bookmark-transaction-schema.ts'

export const bookmarkTransactionFindManySchema = bookmarkTransactionSchema
.pick({
id: true,
label: true,
signature: true,
})
.partial()
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { tryCatch } from '@workspace/core/try-catch'
import type { Database } from '../database.ts'
import type { BookmarkTransaction } from './bookmark-transaction.ts'
import type { BookmarkTransactionFindManyInput } from './bookmark-transaction-find-many-input.ts'
import { bookmarkTransactionFindManySchema } from './bookmark-transaction-find-many-schema.ts'

export async function bookmarkTransactionFindMany(
db: Database,
input: BookmarkTransactionFindManyInput,
): Promise<BookmarkTransaction[]> {
const parsedInput = bookmarkTransactionFindManySchema.parse(input)
const { data, error } = await tryCatch(
db.bookmarkTransactions
.orderBy('updatedAt')
.filter((item) => {
const matchId = !parsedInput.id || item.id === parsedInput.id
const matchLabel = !parsedInput.label || (item.label ? item.label.includes(parsedInput.label) : false)
const matchSignature = !parsedInput.signature || item.signature === parsedInput.signature

return matchId && matchLabel && matchSignature
})
.reverse()
.toArray(),
)
if (error) {
console.log(error)
throw new Error(`Error finding bookmark transactions`)
}
return data
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { z } from 'zod'
import { solanaSignatureSchema } from '../solana/solana-signature-schema.ts'

export const bookmarkTransactionSchema = z.object({
createdAt: z.date(),
id: z.string(),
label: z.string().max(50).optional(),
signature: solanaSignatureSchema,
updatedAt: z.date(),
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import type { Signature } from '@solana/kit'
import type { Database } from '../database.ts'

import { bookmarkTransactionCreate } from './bookmark-transaction-create.ts'
import { bookmarkTransactionDelete } from './bookmark-transaction-delete.ts'
import { bookmarkTransactionFindBySignature } from './bookmark-transaction-find-by-signature.ts'

export async function bookmarkTransactionToggle(db: Database, signature: Signature): Promise<'created' | 'deleted'> {
return db.transaction('rw', db.bookmarkTransactions, async () => {
const existing = await bookmarkTransactionFindBySignature(db, signature)
if (existing) {
await bookmarkTransactionDelete(db, existing.id)
return 'deleted'
} else {
await bookmarkTransactionCreate(db, { signature })
return 'created'
}
})
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { z } from 'zod'

import type { bookmarkTransactionUpdateSchema } from './bookmark-transaction-update-schema.ts'

export type BookmarkTransactionUpdateInput = z.infer<typeof bookmarkTransactionUpdateSchema>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { bookmarkTransactionSchema } from './bookmark-transaction-schema.ts'

export const bookmarkTransactionUpdateSchema = bookmarkTransactionSchema
.omit({ createdAt: true, id: true, signature: true, updatedAt: true })
.partial()
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { tryCatch } from '@workspace/core/try-catch'
import type { Database } from '../database.ts'
import { parseStrict } from '../parse-strict.ts'
import type { BookmarkTransactionUpdateInput } from './bookmark-transaction-update-input.ts'
import { bookmarkTransactionUpdateSchema } from './bookmark-transaction-update-schema.ts'

export async function bookmarkTransactionUpdate(
db: Database,
id: string,
input: BookmarkTransactionUpdateInput,
): Promise<number> {
const parsedInput = parseStrict(bookmarkTransactionUpdateSchema.parse(input))
const { data, error } = await tryCatch(
db.bookmarkTransactions.update(id, {
...parsedInput,
updatedAt: new Date(),
}),
)
if (error) {
console.log(error)
throw new Error(`Error updating bookmark transaction with id ${id}`)
}
return data
}
5 changes: 5 additions & 0 deletions packages/db/src/bookmark-transaction/bookmark-transaction.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import type { z } from 'zod'

import type { bookmarkTransactionSchema } from './bookmark-transaction-schema.ts'

export type BookmarkTransaction = z.infer<typeof bookmarkTransactionSchema>
3 changes: 3 additions & 0 deletions packages/db/src/database.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Dexie, type Table } from 'dexie'
import type { Account } from './account/account.ts'
import type { BookmarkAccount } from './bookmark-account/bookmark-account.ts'
import type { BookmarkTransaction } from './bookmark-transaction/bookmark-transaction.ts'
import type { Network } from './network/network.ts'
import { populate } from './populate.ts'
import type { Setting } from './setting/setting.ts'
Expand All @@ -13,6 +14,7 @@ export interface DatabaseConfig {
export class Database extends Dexie {
accounts!: Table<Account>
bookmarkAccounts!: Table<BookmarkAccount>
bookmarkTransactions!: Table<BookmarkTransaction>
networks!: Table<Network>
settings!: Table<Setting>
wallets!: Table<Wallet>
Expand All @@ -22,6 +24,7 @@ export class Database extends Dexie {
this.version(1).stores({
accounts: 'id, [order+walletId], derivationIndex, order, publicKey, type, walletId',
bookmarkAccounts: 'id, address, label, updatedAt',
bookmarkTransactions: 'id, signature, label, updatedAt',
networks: 'id, name, type',
settings: 'id, &key',
wallets: 'id, name, order',
Expand Down
Loading
Loading