mirror of https://github.com/Qortal/Q-Apps-Utils
commit
6a971fbfdb
16 changed files with 4491 additions and 0 deletions
Binary file not shown.
@ -0,0 +1,7 @@
|
||||
import * as colorsys from "colorsys"; |
||||
|
||||
export const changeLightness = (hexColor: string, amount: number) => { |
||||
const hsl = colorsys.hex2Hsl(hexColor); |
||||
hsl.l += amount; |
||||
return colorsys.hsl2Hex(hsl); |
||||
}; |
@ -0,0 +1,18 @@
|
||||
export function uint8ArrayToBase64(byteArray: Uint8Array): string { |
||||
const chars: string[] = Array.from(byteArray).map(byte => |
||||
String.fromCharCode(byte) |
||||
); |
||||
return btoa(chars.join("")); |
||||
} |
||||
|
||||
export function base64ToUint8Array(base64) { |
||||
const binary_string = atob(base64); |
||||
const len = binary_string.length; |
||||
const bytes = new Uint8Array(len); |
||||
|
||||
for (let i = 0; i < len; i++) { |
||||
bytes[i] = binary_string.charCodeAt(i); |
||||
} |
||||
|
||||
return bytes; |
||||
} |
@ -0,0 +1,9 @@
|
||||
export const setNumberWithinBounds = ( |
||||
num: number, |
||||
minValue: number, |
||||
maxValue: number |
||||
) => { |
||||
if (num > maxValue) return maxValue; |
||||
if (num < minValue) return minValue; |
||||
return num; |
||||
}; |
@ -0,0 +1,56 @@
|
||||
export const isIntegerNum = /^-?[0-9]+$/; |
||||
export const isFloatNum = /^-?[0-9]*\.?[0-9]*$/; |
||||
export const isAllZerosNum = /^0*\.?0*$/; |
||||
|
||||
export const getSigDigits = (number: string) => { |
||||
if (isIntegerNum.test(number)) return 0; |
||||
const decimalSplit = number.split("."); |
||||
return decimalSplit[decimalSplit.length - 1].length; |
||||
}; |
||||
|
||||
export const sigDigitsExceeded = (number: string, sigDigits: number) => { |
||||
return getSigDigits(number) > sigDigits; |
||||
}; |
||||
|
||||
export const removeTrailingZeros = (s: string) => { |
||||
return Number(s).toString(); |
||||
}; |
||||
|
||||
export const mathOnStringNumbers = ( |
||||
s1: string, |
||||
s2: string, |
||||
operation: (n1: number, n2: number) => number |
||||
) => { |
||||
const n1 = Number(s1); |
||||
const n2 = Number(s2); |
||||
if (isNaN(n1) || isNaN(n2)) throw TypeError("String is not a Number!"); |
||||
return operation(n1, n2).toString(); |
||||
}; |
||||
export const addStringNumbers = (s1: string, s2: string) => { |
||||
return mathOnStringNumbers(s1, s2, (n1, n2) => { |
||||
return n1 + n2; |
||||
}); |
||||
}; |
||||
|
||||
export const stringIsEmpty = (value: string) => { |
||||
return value === ""; |
||||
}; |
||||
|
||||
export const stringIsNaN = (value: string) => { |
||||
return Number.isNaN(Number(value)); |
||||
}; |
||||
|
||||
export const stringIsNumber = (value: string) => { |
||||
return !stringIsNaN(value); |
||||
}; |
||||
|
||||
export const toNumber = (value: string | number) => { |
||||
return Number(value); |
||||
}; |
||||
export const toString = (value: string | number) => { |
||||
return value.toString(); |
||||
}; |
||||
export const truncateNumber = (value: string | number, sigDigits: number) => { |
||||
const valueNum = toNumber(value); |
||||
return valueNum.toFixed(sigDigits); |
||||
}; |
@ -0,0 +1,14 @@
|
||||
const assembleURLParams = (params: object) => { |
||||
let finalUrl = ""; |
||||
const urls: string[] = []; |
||||
|
||||
Object.entries(params).map(([key, value]) => { |
||||
urls.push(`${key}=${value.toString()}`); |
||||
}); |
||||
|
||||
urls.map((url, index) => { |
||||
if (index > 0) finalUrl += "&"; |
||||
finalUrl += url; |
||||
}); |
||||
return finalUrl; |
||||
}; |
@ -0,0 +1,79 @@
|
||||
import { ConfirmationStatus, TransactionType } from "./Types"; |
||||
|
||||
export interface GetRequestData { |
||||
limit?: number; |
||||
offset?: number; |
||||
reverse?: boolean; |
||||
} |
||||
|
||||
export interface TransactionSearchParams extends GetRequestData { |
||||
startBlock?: number; |
||||
blockLimit?: number; |
||||
txGroupId?: number; |
||||
txType: TransactionType[]; |
||||
address: string; |
||||
confirmationStatus: ConfirmationStatus; |
||||
} |
||||
|
||||
export interface SearchTransactionResponse { |
||||
type: string; |
||||
timestamp: number; |
||||
reference: string; |
||||
fee: string; |
||||
signature: string; |
||||
txGroupId: number; |
||||
blockHeight: number; |
||||
approvalStatus: string; |
||||
creatorAddress: string; |
||||
senderPublicKey: string; |
||||
recipient: string; |
||||
amount: string; |
||||
} |
||||
|
||||
export interface QortalRequestOptions { |
||||
action: string; |
||||
name?: string; |
||||
service?: string; |
||||
data64?: string; |
||||
title?: string; |
||||
description?: string; |
||||
category?: string; |
||||
tags?: string[] | string; |
||||
identifier?: string; |
||||
address?: string; |
||||
metaData?: string; |
||||
encoding?: string; |
||||
includeMetadata?: boolean; |
||||
limit?: number; |
||||
offset?: number; |
||||
reverse?: boolean; |
||||
resources?: any[]; |
||||
filename?: string; |
||||
list_name?: string; |
||||
item?: string; |
||||
items?: string[]; |
||||
tag1?: string; |
||||
tag2?: string; |
||||
tag3?: string; |
||||
tag4?: string; |
||||
tag5?: string; |
||||
coin?: string; |
||||
destinationAddress?: string; |
||||
amount?: number; |
||||
blob?: Blob; |
||||
mimeType?: string; |
||||
file?: File; |
||||
encryptedData?: string; |
||||
mode?: string; |
||||
query?: string; |
||||
excludeBlocked?: boolean; |
||||
exactMatchNames?: boolean; |
||||
creationBytes?: string; |
||||
type?: string; |
||||
assetId?: number; |
||||
txType?: TransactionType[]; |
||||
confirmationStatus?: string; |
||||
startBlock?: number; |
||||
blockLimit?: number; |
||||
txGroupId?: number; |
||||
} |
@ -0,0 +1,33 @@
|
||||
import { |
||||
GetRequestData, |
||||
SearchTransactionResponse, |
||||
TransactionSearchParams, |
||||
} from "./Interfaces"; |
||||
import { stringIsEmpty } from "../Numbers/StringNumbers"; |
||||
|
||||
export const searchTransactions = async (params: TransactionSearchParams) => { |
||||
return (await qortalRequest({ |
||||
action: "SEARCH_TRANSACTIONS", |
||||
...params, |
||||
})) as SearchTransactionResponse[]; |
||||
}; |
||||
|
||||
type AccountName = { name: string; owner: string }; |
||||
|
||||
export const getAccountNames = async ( |
||||
address: string, |
||||
params?: GetRequestData |
||||
) => { |
||||
const names = (await qortalRequest({ |
||||
action: "GET_ACCOUNT_NAMES", |
||||
address, |
||||
...params, |
||||
})) as AccountName[]; |
||||
|
||||
const namelessAddress = { name: "", owner: address }; |
||||
const emptyNamesFilled = names.map(({ name, owner }) => { |
||||
return stringIsEmpty(name) ? namelessAddress : { name, owner }; |
||||
}); |
||||
|
||||
return emptyNamesFilled.length > 0 ? emptyNamesFilled : [namelessAddress]; |
||||
}; |
@ -0,0 +1,40 @@
|
||||
export const sendCoin = async ( |
||||
address: string, |
||||
amount: number, |
||||
coin: string |
||||
) => { |
||||
return qortalRequest({ |
||||
action: "SEND_COIN", |
||||
coin, |
||||
destinationAddress: address, |
||||
amount, |
||||
}); |
||||
}; |
||||
|
||||
export const sendQORT = async (address: string, amount: number) => { |
||||
return await sendCoin(address, amount, "QORT"); |
||||
}; |
||||
|
||||
export const sendBitCoin = async (address: string, amount: number) => { |
||||
return await sendCoin(address, amount, "BTC"); |
||||
}; |
||||
|
||||
export const sendLiteCoin = async (address: string, amount: number) => { |
||||
return await sendCoin(address, amount, "LTC"); |
||||
}; |
||||
|
||||
export const sendDogeCoin = async (address: string, amount: number) => { |
||||
return await sendCoin(address, amount, "DOGE"); |
||||
}; |
||||
|
||||
export const sendDigiByte = async (address: string, amount: number) => { |
||||
return await sendCoin(address, amount, "DGB"); |
||||
}; |
||||
|
||||
export const sendRavenCoin = async (address: string, amount: number) => { |
||||
return await sendCoin(address, amount, "RVN"); |
||||
}; |
||||
|
||||
export const sendPirateChain = async (address: string, amount: number) => { |
||||
return await sendCoin(address, amount, "ARRR"); |
||||
}; |
@ -0,0 +1,43 @@
|
||||
export type ConfirmationStatus = "CONFIRMED" | "UNCONFIRMED" | "BOTH"; |
||||
export type TransactionType = |
||||
| "GENESIS" |
||||
| "PAYMENT" |
||||
| "REGISTER_NAME" |
||||
| "UPDATE_NAME" |
||||
| "SELL_NAME" |
||||
| "CANCEL_SELL_NAME" |
||||
| "BUY_NAME" |
||||
| "CREATE_POLL" |
||||
| "VOTE_ON_POLL" |
||||
| "ARBITRARY" |
||||
| "ISSUE_ASSET" |
||||
| "TRANSFER_ASSET" |
||||
| "CREATE_ASSET_ORDER" |
||||
| "CANCEL_ASSET_ORDER" |
||||
| "MULTI_PAYMENT" |
||||
| "DEPLOY_AT" |
||||
| "MESSAGE" |
||||
| "CHAT" |
||||
| "PUBLICIZE" |
||||
| "AIRDROP" |
||||
| "AT" |
||||
| "CREATE_GROUP" |
||||
| "UPDATE_GROUP" |
||||
| "ADD_GROUP_ADMIN" |
||||
| "REMOVE_GROUP_ADMIN" |
||||
| "GROUP_BAN" |
||||
| "CANCEL_GROUP_BAN" |
||||
| "GROUP_KICK" |
||||
| "GROUP_INVITE" |
||||
| "CANCEL_GROUP_INVITE" |
||||
| "JOIN_GROUP" |
||||
| "LEAVE_GROUP" |
||||
| "GROUP_APPROVAL" |
||||
| "SET_GROUP" |
||||
| "UPDATE_ASSET" |
||||
| "ACCOUNT_FLAGS" |
||||
| "ENABLE_FORGING" |
||||
| "REWARD_SHARE" |
||||
| "ACCOUNT_LEVEL" |
||||
| "TRANSFER_PRIVS" |
||||
| "PRESENCE"; |
@ -0,0 +1,4 @@
|
||||
export const printVar = (variable: object) => { |
||||
const [key, value] = Object.entries(variable)[0]; |
||||
console.log(key, " is: ", value); |
||||
}; |
@ -0,0 +1,92 @@
|
||||
type TransactionType = |
||||
| "GENESIS" |
||||
| "PAYMENT" |
||||
| "REGISTER_NAME" |
||||
| "UPDATE_NAME" |
||||
| "SELL_NAME" |
||||
| "CANCEL_SELL_NAME" |
||||
| "BUY_NAME" |
||||
| "CREATE_POLL" |
||||
| "VOTE_ON_POLL" |
||||
| "ARBITRARY" |
||||
| "ISSUE_ASSET" |
||||
| "TRANSFER_ASSET" |
||||
| "CREATE_ASSET_ORDER" |
||||
| "CANCEL_ASSET_ORDER" |
||||
| "MULTI_PAYMENT" |
||||
| "DEPLOY_AT" |
||||
| "MESSAGE" |
||||
| "CHAT" |
||||
| "PUBLICIZE" |
||||
| "AIRDROP" |
||||
| "AT" |
||||
| "CREATE_GROUP" |
||||
| "UPDATE_GROUP" |
||||
| "ADD_GROUP_ADMIN" |
||||
| "REMOVE_GROUP_ADMIN" |
||||
| "GROUP_BAN" |
||||
| "CANCEL_GROUP_BAN" |
||||
| "GROUP_KICK" |
||||
| "GROUP_INVITE" |
||||
| "CANCEL_GROUP_INVITE" |
||||
| "JOIN_GROUP" |
||||
| "LEAVE_GROUP" |
||||
| "GROUP_APPROVAL" |
||||
| "SET_GROUP" |
||||
| "UPDATE_ASSET" |
||||
| "ACCOUNT_FLAGS" |
||||
| "ENABLE_FORGING" |
||||
| "REWARD_SHARE" |
||||
| "ACCOUNT_LEVEL" |
||||
| "TRANSFER_PRIVS" |
||||
| "PRESENCE"; |
||||
|
||||
interface QortalRequestOptions { |
||||
action: string; |
||||
name?: string; |
||||
service?: string; |
||||
data64?: string; |
||||
title?: string; |
||||
description?: string; |
||||
category?: string; |
||||
tags?: string[] | string; |
||||
identifier?: string; |
||||
address?: string; |
||||
metaData?: string; |
||||
encoding?: string; |
||||
includeMetadata?: boolean; |
||||
limit?: number; |
||||
offset?: number; |
||||
reverse?: boolean; |
||||
resources?: any[]; |
||||
filename?: string; |
||||
list_name?: string; |
||||
item?: string; |
||||
items?: string[]; |
||||
tag1?: string; |
||||
tag2?: string; |
||||
tag3?: string; |
||||
tag4?: string; |
||||
tag5?: string; |
||||
coin?: string; |
||||
destinationAddress?: string; |
||||
amount?: number; |
||||
blob?: Blob; |
||||
mimeType?: string; |
||||
file?: File; |
||||
encryptedData?: string; |
||||
mode?: string; |
||||
query?: string; |
||||
excludeBlocked?: boolean; |
||||
exactMatchNames?: boolean; |
||||
creationBytes?: string; |
||||
type?: string; |
||||
assetId?: number; |
||||
txType?: TransactionType[]; |
||||
confirmationStatus?: string; |
||||
startBlock?: number; |
||||
blockLimit?: number; |
||||
txGroupId?: number; |
||||
} |
||||
|
||||
declare function qortalRequest(options: QortalRequestOptions): Promise<object>; |
@ -0,0 +1,40 @@
|
||||
{ |
||||
"name": "q-utils", |
||||
"private": true, |
||||
"version": "0.0.0", |
||||
"type": "module", |
||||
"scripts": { |
||||
"dev": "vite", |
||||
"build": "tsc && vite build", |
||||
"lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", |
||||
"preview": "vite preview" |
||||
}, |
||||
"dependencies": { |
||||
"@emotion/react": "^11.11.1", |
||||
"@emotion/styled": "^11.11.0", |
||||
"@mui/icons-material": "^5.11.11", |
||||
"@mui/material": "^5.11.13", |
||||
"@mui/system": "^5.14.5", |
||||
"colorsys": "github:netbeast/colorsys", |
||||
"react": "^18.2.0", |
||||
"react-dom": "^18.2.0", |
||||
"react-dropzone": "^14.2.3", |
||||
"react-intersection-observer": "^9.4.3", |
||||
"react-quill": "^2.0.0", |
||||
"react-rnd": "^10.4.1", |
||||
"ts-key-enum": "^2.0.12" |
||||
}, |
||||
"devDependencies": { |
||||
"@types/react": "^18.0.28", |
||||
"@types/react-dom": "^18.0.11", |
||||
"@typescript-eslint/eslint-plugin": "^5.62.0", |
||||
"@typescript-eslint/parser": "^5.62.0", |
||||
"@vitejs/plugin-react": "^4.0.0", |
||||
"eslint": "^8.51.0", |
||||
"eslint-plugin-react-hooks": "^4.6.0", |
||||
"eslint-plugin-react-refresh": "^0.3.4", |
||||
"prettier": "^3.0.3", |
||||
"typescript": "^5.0.2", |
||||
"vite": "^4.3.2" |
||||
} |
||||
} |
@ -0,0 +1,26 @@
|
||||
{ |
||||
"compilerOptions": { |
||||
"target": "ESNext", |
||||
"lib": ["DOM", "DOM.Iterable", "ESNext"], |
||||
"module": "ESNext", |
||||
"skipLibCheck": true, |
||||
|
||||
/* Bundler mode */ |
||||
"moduleResolution": "Node", |
||||
"esModuleInterop": true, |
||||
"allowImportingTsExtensions": true, |
||||
"resolveJsonModule": true, |
||||
"isolatedModules": true, |
||||
"noEmit": true, |
||||
"jsx": "react-jsx", |
||||
"noImplicitAny": false, |
||||
/* Linting */ |
||||
"strict": true, |
||||
"noUnusedLocals": false, |
||||
"noUnusedParameters": false, |
||||
"noFallthroughCasesInSwitch": true, |
||||
"allowSyntheticDefaultImports": true |
||||
}, |
||||
"include": ["**/*"], |
||||
"references": [{ "path": "./tsconfig.node.json" }] |
||||
} |
Loading…
Reference in new issue