Compare commits

..

1 Commits

Author SHA1 Message Date
poka 68c8a61939 add gdev.p2p.legal endpoint 2022-11-27 03:30:27 +01:00
79 changed files with 1935 additions and 3090 deletions

6
.gitignore vendored
View File

@ -47,6 +47,9 @@ android/key.properties
# Rust things # Rust things
/target /target
# Linux builds
linux/
# Custom # Custom
scripts/private/ scripts/private/
AppDir/ AppDir/
@ -56,4 +59,5 @@ android/app/build.gradle
integration_test/duniter/data/chains/ integration_test/duniter/data/chains/
# Ignore PC deps # Ignore PC deps
scripts/pushGecko macos/
windows/

View File

@ -7,7 +7,7 @@ stages:
.env: .env:
image: axiomteam/gecko-ci:v0.0.11 image: axiomteam/gecko-ci:v0.0.11
tags: tags:
- docker - redshift
format: format:
extends: .env extends: .env
@ -28,6 +28,8 @@ build_and_test:
- if: $CI_COMMIT_TAG || $CI_MERGE_REQUEST_ID - if: $CI_COMMIT_TAG || $CI_MERGE_REQUEST_ID
- when: manual - when: manual
stage: build_and_test stage: build_and_test
tags:
- redshift
script: script:
- flutter analyze - flutter analyze

Binary file not shown.

Before

Width:  |  Height:  |  Size: 246 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 192 KiB

After

Width:  |  Height:  |  Size: 166 KiB

View File

@ -71,8 +71,7 @@
"areYouSureToDeleteWallet": "Are you sure you want to delete the chest \"{}\"?", "areYouSureToDeleteWallet": "Are you sure you want to delete the chest \"{}\"?",
"areYouSureForgetAllChests": "Are you sure you want to forget all your chests?", "areYouSureForgetAllChests": "Are you sure you want to forget all your chests?",
"areYouSureToForgetWallet": "Are you sure you wan to forget the wallet \"{}\"?", "areYouSureToForgetWallet": "Are you sure you wan to forget the wallet \"{}\"?",
"areYouSureYouWantToCertify1": "Are you sure you want to certify the identity :", "areYouSureYouWantToCertify": "Are you sure you want to certify the address:\n\n{}",
"areYouSureYouWantToCertify2": "having the address :",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"keepYourMnemonicSecret": "Try to keep this phrase a secret, as it allows anyone who knows it to access all your wallets.", "keepYourMnemonicSecret": "Try to keep this phrase a secret, as it allows anyone who knows it to access all your wallets.",
@ -157,7 +156,7 @@
"hours": "{} hours {}", "hours": "{} hours {}",
"days": "{} days", "days": "{} days",
"months": "{} months", "months": "{} months",
"certify": "Certify this\nidentity", "certify": "Certify",
"from": "From:", "from": "From:",
"to": "To:", "to": "To:",
"amount": "Amount:", "amount": "Amount:",
@ -169,7 +168,7 @@
"deleteThisWallet": "Delete this wallet", "deleteThisWallet": "Delete this wallet",
"cancel": "Cancel", "cancel": "Cancel",
"inBlockchainResult": "In {} blockchain", "inBlockchainResult": "In {} blockchain",
"search": "Search an identity\nor an address", "search": "Search",
"currencyNode": "{} node :", "currencyNode": "{} node :",
"contactsManagementWithNbr": "My contacts ({})", "contactsManagementWithNbr": "My contacts ({})",
"contactsManagement": "My contacts", "contactsManagement": "My contacts",
@ -196,12 +195,5 @@
"youCannotRevokeThisIdentity": "You cannot revoke this identity while\nit is member of the blacksmiths web", "youCannotRevokeThisIdentity": "You cannot revoke this identity while\nit is member of the blacksmiths web",
"showUdAmounts": "Show amounts in UD", "showUdAmounts": "Show amounts in UD",
"ud": "{}UD", "ud": "{}UD",
"chooseATargetWallet": "Choose a target wallet", "chooseATargetWallet": "Choose a target wallet"
"thisMnemonicHasBeenCopiedToClipboard": "This mnemonic has been copied to clipboard",
"smithCantMigrateIdentity":"You can't migrate this identity while you're member of smith web",
"received": "Received",
"sent": "Sent",
"createIdentity": "Create a new \nidentity",
"memberAccountOf": "Account of {}",
"pasteAddress": "Paste address from\nclipboard"
} }

View File

@ -1,92 +1,90 @@
{ {
"searchWallet": "Buscar\nmonedero", "searchWallet": "Buscar\nbilletera",
"manageWallets": "Gestionar\nmonederos", "manageWallets": "Gestionar\nbilleteras",
"scanQRCode": "Escanear un\ncódigo QR", "scanQRCode": "Escanear un\ncódigo QR",
"wellConnectedToNode": "Estás bien conectado al nodo\n{}", "wellConnectedToNode": "Estas bien conectada al nodo\n{}",
"networkLost": "Se ha perdido la red...", "networkLost": "Se ha perdido la red...",
"noDuniterEndointAvailable": "No hay servidor disponible...", "noDuniterEndointAvailable": "No hay servidor disponible...",
"connectionPending": "Conexión pendiente...", "connectionPending": "Conexión pendiente...",
"noLizard": "no hay lagarto ;-)", "noLizard": "no hay lagarto ;-)",
"loading": "Cargando...", "loading": "Cargando...",
"forgot_password.png": "forgot_password_es.png", "forgot_password.png": "forgot_password_en.png",
"warningForgotPassword": "En una cadena de bloques o blockchain, no hay procedimiento de recuperación mediante correo electrónico. Sólo tu frase de recuperación puede permitirte recuperar tus Ğ1 en cualquier momento.", "warningForgotPassword": "In a blockchain, there is no email recovery procedure. Only your recovery phrase can allow you to recover your Ğ1 at any time.",
"fastAppDescription": "La aplicación de pago {}\nmás rápida que un reptil de Vietnam", "fastAppDescription": "La aplicación de pago {}\nmás rápida que un reptil de Vietnam",
"createWallet": "Crear un monedero", "createWallet": "Crear una billetera",
"restoreWallet": "Restaurar mis monederos", "restoreWallet": "Restaurar mis billeteras",
"parameters": "Parámetros", "parameters": "Parámetros",
"chooseAnotherMnemonic": "Elige otra frase de restauración", "chooseAnotherMnemonic": "Choose an other\nmnemonic sentence",
"iNotedMyMnemonic": "He anotado mi frase de restauración", "iNotedMyMnemonic": "He escrito mi frase",
"printMyMnemonic": "Imprimir mi frase de restauración", "printMyMnemonic": "Print my mnemonic sentence",
"manageChest": "Configurar este cofre", "manageChest": "Configure this chest",
"changeChest": "Cambiar de cofre", "changeChest": "Change chest",
"GeckoChest": "Cofre de Ğecko", "geckoChest": "Ğecko chest",
"toUnlockEnterPassword": "Para desbloquear tu cofre, introduce tu contraseña, lejos de lagartijas curiosas:", "toUnlockEnterPassword": "To unlock your safe, enter your secret code, away from prying lizards:",
"rememberPassword": "Mantener en memoria mi contraseña durante 15 minutos", "rememberPassword": "Keep this code in memory for 15 minutes",
"myRootWallet": "Mi monedero principal", "myRootWallet": "Mi billetera principal",
"currentWallet": "Mi cofre actual", "currentWallet": "My current chest",
"wallet": "monedero", "wallet": "Billetera",
"displayMnemonic": "Mostrar mi frase de restauración", "displayMnemonic": "Display my mnemonic sentence",
"changePassword": "Cambiar mi contraseña", "changePassword": "Cambiar mi contraseña",
"createDerivation": "Crear una nueva derivación", "createDerivation": "Create a new derivation",
"createCustomDerivation": "Crear una nueva derivación personalizada", "createCustomDerivation": "Create a new custom derivation",
"deleteChest": "Borrar este cofre", "deleteChest": "Delete this chest",
"openThisChest": "Abrir este cofre", "openThisChest": "Open this chest",
"createChest": "Crear un nuevo cofre", "createChest": "Create a new chest",
"importChest": "Importar un cofre", "importChest": "Import a chest",
"selectMyChest": "Seleccionar mi cofre", "selectMyChest": "Select my chest",
"accessMyChest": "Acceder a mi cofre", "accessMyChest": "Access my chest",
"manageMembership": "Administrar mi afiliación", "manageMembership": "Manage my membership",
"chooseThisWallet": "Elegir este monedero", "chooseThisWallet": "Elegir esta billetera",
"thisWalletIsDefault": "Monedero definido por defecto", "thisWalletIsDefault": "This wallet is the default one",
"defineWalletAsDefault": "Definir este monedero como por defecto", "defineWalletAsDefault": "Define this as the default one",
"displayActivity": "Visualizar actividad", "displayActivity": "Display activity",
"displayNActivity": "Visualizar\nactividad", "displayNActivity": "Display\nactivity",
"memberValidated": "Miembro validado!", "memberValidated": "Miembro validado!",
"copyAddress": "Copiar\nla dirección", "copyAddress": "Copiar\ndirección",
"copy": "Copiar", "copy": "Copiar",
"thisAddressHasBeenCopiedToClipboard": "Esta dirección se ha copiado al portapapeles", "thisAddressHasBeenCopiedToClipboard": "Esta dirección se ha copiado al cortapapeles",
"chooseWalletName": "Elige un nuevo nombre\npara tu monedero:", "chooseWalletName": "Choose a new name\nfor your wallet:",
"choosePassword": "Elige una contraseña aleatoria:", "choosePassword": "Choose a random password:",
"chooseDerivation": "Elige una derivación:", "chooseDerivation": "Choose a derivation:",
"validate": "Validar", "validate": "Validar",
"confirm": "Confirmar", "confirm": "Confirmar",
"confirmPayment": "Confirmar pago", "confirmPayment": "Confirmar pago",
"GeckoGenerateYourWalletFromMnemonic": "Ğecko construye tu monedero a partir de una **frase de restauración**. Es como unos planos que permiten restaurar tu monedero.", "geckoGenerateYourWalletFromMnemonic": "Ğecko builds your wallet from a **restoration sentence**. It is a bit like the blueprint that builds your wallet.",
"keepThisMnemonicSecure": "Guarda esta frase con cuidado, porque sin ella Ğecko no podrá restaurar tus monederos el día que cambies de dispositivo.", "keepThisMnemonicSecure": "Keep this sentence carefully, because without it Ğecko will not be able to rebuild your wallets the day you change your phone.",
"GeckoGeneratedYourMnemonicKeepItSecret": "¡Ğecko generó tu frase de restauración con éxito! Mantenla en secreto, porque cualquiera que la sepa puede acceder a todos tus monederos.", "geckoGeneratedYourMnemonicKeepItSecret": "Ğecko generated your mnemonic successfully! Keep it secret, because anyone who knows it can access all your wallets.",
"newWallet": "Nuevo monedero", "newWallet": "New Wallet",
"itsTimeToUseAPenAndPaper": "Es el momento de coger un **papel y un bolígrafo** para anotar tu frase de restauración.", "itsTimeToUseAPenAndPaper": "It's time to take a **pen and paper** in order to write down your mnemonic.",
"yourMnemonic": "tu frase de restauración", "yourMnemonic": "Your mnemonic",
"gecko_also_can_forget.png": "gecko_also_can_forget_es.png", "gecko_also_can_forget.png": "gecko_also_can_forget_en.png",
"didYouNoteMnemonicToBeSureTypeWord": "¿Anotaste bien tu frase de restauración? Para asegurarnos, escriba la **palabra #{}** de tu frase de restauración en el cuadro de abajo:", "didYouNoteMnemonicToBeSureTypeWord": "Did you write down your menmonic?\n\n To be sure, please type the **{}th word** of your restoration phrase in the field below:",
"GeckoWillGenerateAPassword": "Ahora Ğecko te generará una contraseña corta que te permitirá acceder rápidamente a tus monederos, sin tener que escribir cada vez tu frase de recuperación.", "geckoWillGenerateAPassword": "Gecko will now generate for you a short password that will allow you to quickly access your wallets, without having to type your recovery sentence every time.",
"myPassword": "Mi contraseña", "myPassword": "My password",
"thisPasswordProtectsYourWalletsInASecureChest": "Esta contraseña protege tus monederos en un cofre **del que sólo tú tienes acceso**, para que tus monederos no puedan ser utilizados por otros.", "thisPasswordProtectsYourWalletsInASecureChest": "This secret code protects your wallets in a safe **which only you have the code for**, so that your wallets cannot be used by others.",
"hereIsThePasswordKeepIt": "¡Y aquí está tu contraseña!\n\nMemorízala o anótala, porque Ğecko te la pedirá **cada vez** que quieras hacer un pago en este dispositivo.", "hereIsThePasswordKeepIt": "And here is your password!\n\nMemorize it or write it down, because you will be asked **every time** you want to make a payment on this device.",
"chooseAnotherPassword": "Elige otra contraseña", "chooseAnotherPassword": "Elige otra contraseña",
"iNotedMyPassword": "He anotado mi contraseña", "iNotedMyPassword": "I noted my password",
"GeckoWillCheckPassword": "Ğecko comprobará contigo si has recordado tu contraseña. Escribe tu contraseña en el cuadro de abajo para comprobar que lo has apuntado correctamente.", "geckoWillCheckPassword": "Gecko will check with you if you have remembered your secret code.\n\n Type your secret code in the field below to check that you have written it down correctly.",
"yourChestAndWalletWereCreatedSuccessfully": "¡Genial!\n\nTu cofre y tu primer monedero han sido creados con éxito.\n\n¡Felicidades!", "yourChestAndWalletWereCreatedSuccessfully": "Super!\n\nYour chest and your first portfolio have been created with great success.\n\nCongratulations!",
"allGood": "¡Todo bien!", "allGood": "That's all good!",
"areYouSureToDeleteWallet": "¿Seguro de que quieres eliminar el cofre \"{}\"?", "areYouSureToDeleteWallet": "Are you sure you want to delete the chest \"{}\"?",
"areYouSureForgetAllChests": "¿Seguro de que quieres olvidar todos tus cofres?", "areYouSureForgetAllChests": "Are you sure you want to forget all your chests?",
"areYouSureToForgetWallet": "¿Seguro de que quieres olvidar el monedero \"{}\"?", "areYouSureToForgetWallet": "Are you sure you wan to forget the wallet \"{}\"?",
"areYouSureYouWantToCertify": "¿Seguro de que quiere certificar a la dirección\n\n{}?", "areYouSureYouWantToCertify": "Are you sure you want to certify the address:\n\n{}",
"areYouSureYouWantToCertify1": "¿Seguro de que quiere certificar a la identidad :", "yes": "Si",
"areYouSureYouWantToCertify2": " a la dirección :",
"yes": "Sí",
"no": "No", "no": "No",
"keepYourMnemonicSecret": "Intenta mantener esta frase de restauración en secreto, ya que permite a cualquiera que la conozca acceder a todas tus monederos.", "keepYourMnemonicSecret": "Try to keep this phrase a secret, as it allows anyone who knows it to access all your wallets.",
"iGeneratedYourMnemonicKeepItSecret": "¡He generado tu frase de restauración!\nIntenta mantenerla en secreto, ya que permite a cualquiera que la conozca acceder a todos tus monederos.", "iGeneratedYourMnemonicKeepItSecret": "I've generated your restoration phrase!\n Try to keep it a secret, as it allows anyone who knows it to access all your portfolios.",
"myMnemonic": "Mi frase de restauración", "myMnemonic": "My mnemonic",
"close": "Cerrar", "close": "Close",
"toRestoreEnterMnemonic": "Para restaurar tus monederos Ğecko, introduce las 12 palabras que componen tu frase de restauración en los cuadros de abajo:", "toRestoreEnterMnemonic": "To restore your Gecko wallets, enter in the fields below the 12 words that constitute your restoration phrase:",
"pasteFromClipboard": "Pegar del\nportapapeles", "pasteFromClipboard": "Paste from\nclipboard",
"restoreAChest": "Restaurar un cofre", "restoreAChest": "Restore a chest",
"restoreThisChest": "Restaurar este cofre", "restoreThisChest": "Restore this chest",
"continue": "Continuar", "continue": "Continuar",
"itsTheGoodWord": "¡Es la palabra correcta!", "itsTheGoodWord": "It's the good word!",
"nthMnemonicWord": "palabra de tu mnemotecnia", "nthMnemonicWord": "word of your mnemonic",
"1th": "Primera", "1th": "Primera",
"2th": "Segunda", "2th": "Segunda",
"3th": "Tercera", "3th": "Tercera",
@ -100,17 +98,17 @@
"11th": "Undécima", "11th": "Undécima",
"12th": "Duodécima", "12th": "Duodécima",
"yourPasswordLengthIsX": "La longitud de tu contraseña es {}", "yourPasswordLengthIsX": "La longitud de tu contraseña es {}",
"noIdentity": "Ninguna identidad", "noIdentity": "No identity",
"identityCreated": "Identidad creada", "identityCreated": "Identidad creada",
"identityConfirmed": "Identidad confirmada", "identityConfirmed": "Identidad confirmada",
"identityExpired": "Identidad caducada", "identityExpired": "Identitdad caducada",
"confirmYourIdentity": "Confirma tu identidad", "confirmYourIdentity": "Confirma tu identidad",
"noDuniterNodeAvailableTryLater": "No hay ningún nodo Duniter disponible, por favor, inténtalo más tarde", "noDuniterNodeAvailableTryLater": "No Duniter node available, please try again later",
"youAreConnectedToNode": "Estás conectado al nodo", "youAreConnectedToNode": "You are connected to node",
"accountActivity": "Actividad de la cuenta", "accountActivity": "Actividad de la cuenta",
"noNetworkNoHistory": "El estado de la red no permite\nmostrar el historial de la cuenta", "noNetworkNoHistory": "Network state does not allow\nto display account history",
"noDataToDisplay": "No hay datos que mostrar.", "noDataToDisplay": "No data to be displayed.",
"noTransactionToDisplay": "No hay transacciónes a mostrar", "noTransactionToDisplay": "No transaction to display",
"month1": "Enero", "month1": "Enero",
"month2": "Febrero", "month2": "Febrero",
"month3": "Marzo", "month3": "Marzo",
@ -126,83 +124,76 @@
"today": "Hoy", "today": "Hoy",
"yesterday": "Ayer", "yesterday": "Ayer",
"thisWeek": "Esta semana", "thisWeek": "Esta semana",
"chestNotCompatibleMustReinstallGecko": "La versión de tus cofres no es compatible con esta versión de Ğecko.\nTodos tus cofres serán olvidados, debes importarlos de nuevo.", "chestNotCompatibleMustReinstallGecko": "The version of your safes is no longer compatible with this version of Ğecko.\nAll your safes will be forgotten, you must import them again.",
"notConnectedToInternet": "No estás conectado a Internet", "notConnectedToInternet": "No estas conectado a internet",
"researchResults": "Resultados de tu búsqueda", "researchResults": "Results of your research",
"resultsFor": "Resultados para ", "resultsFor": "Results for ",
"forgetAllMyChests": "Olvida todos mis cofres", "forgetAllMyChests": "Forget all my chests",
"transaction": "Transacción", "transaction": "Transaccion",
"certification": "Certificación", "certification": "Certificacion",
"identityConfirm": "Confirmación de la identidad", "identityConfirm": "Identity confirmation",
"revokeAdhesion": "Revocación de adhesión", "revokeAdhesion": "Adhesion revocation",
"strangeTransaction": "Transacción extraña", "strangeTransaction": "Strange transaction",
"sending": "Enviando...", "sending": "Enviando...",
"propagating": "Propagando...", "propagating": "Propagando...",
"validating": "Validando...", "validating": "Validando...",
"anErrorOccured": "Ocurrió un error", "anErrorOccurred": "Ocurrió un error",
"24hbetweenCerts": "Hay que esperar 24 horas entre certificaciones", "24hbetweenCerts": "You have to wait 24h between certs",
"canNotCertifySelf": "No puedes certificarte a ti mismo", "canNotCertifySelf": "You can not certify yourself",
"nameAlreadyExist": "Este nombre ya está ocupado", "nameAlreadyExist": "This name is already taken",
"2GDtoKeepAlive": "Tienes que mantener al menos 2ĞD para mantener tu cuenta viva", "2GDtoKeepAlive": "You have to keep at least 2ĞD to keep your account alive",
"youHaveToFeedThisAccountBeforeUsing": "Tienes que nutrir el balance\nde esta cuenta antes de usarla.", "youHaveToFeedThisAccountBeforeUsing": "You have to feed this account\nbefore using it.",
"execTimeoutOver": "Se ha agotado el tiempo de ejecución", "execTimeoutOver": "Execution timeout is over",
"seeAWallet": "Ver un monedero", "seeAWallet": "Ver una billetera",
"mustWaitXBeforeCertify": "Tienes que esperar\n{} antes de\nvolver a certificar", "mustWaitXBeforeCertify": "Tienes que esperar\n{} antes de\nvolver a certificar",
"mustConfirmHisIdentity": "Esta persona debe confirmar\nsu identidad antes de poder ser certificada", "mustConfirmHisIdentity": "This person must confirm\nhis identity before can be\ncertified",
"canRenewCertInX": "Podrás renovar\nla certificación\nen {}", "canRenewCertInX": "You can renew\nthis certification\nin {}",
"executeATransfer": "Ejecutar una transacción", "executeATransfer": "Execute a transfer",
"executeTheTransfer": "Ejecutar la transacción", "executeTheTransfer": "Execute the transfer",
"doATransfer" : "Hacer una\ntransacción", "doATransfer" : "Execute a\ntransfer",
"seconds": "{} segundos", "seconds": "{} segundos",
"minutes": "{} minutos", "minutes": "{} minutos",
"hours": "{} horas {}", "hours": "{} horas {}",
"days": "{} dias", "days": "{} dias",
"months": "{} meses", "months": "{} meses",
"certify": "Certificar esta\nidentidad", "certify": "Certify",
"from": "De:", "from": "De:",
"to": "A:", "to": "A:",
"amount": "Importe:", "amount": "Importe:",
"choiceOfSourceWallet": "Elige un monedero de origen", "choiceOfSourceWallet": "Choose a source wallet",
"extrinsicInProgress": "{} en progreso", "extrinsicInProgress": "{} en progreso",
"extrinsicValidated": "¡ {} validado !", "extrinsicValidated": "{} validado !",
"fromMinus": "de", "fromMinus": "de",
"toMinus": "a", "toMinus": "a",
"deleteThisWallet": "Borrar este monedero", "deleteThisWallet": "Delete this wallet",
"cancel": "Cancelar", "cancel": "Cancelar",
"inBlockchainResult": "En la blockchain {}", "inBlockchainResult": "In {} blockchain",
"search": "Buscar una identidad\no una dirección", "search": "Buscar",
"currencyNode": "Nodo {} :", "currencyNode": "{} nodo :",
"contactsManagementWithNbr": "Mis contactos ({})", "contactsManagementWithNbr": "Mis contactos ({})",
"contactsManagement": "Mis contactos", "contactsManagement": "Mis contactos",
"noContacts": "No tienes ningún contacto", "noContacts": "You don't have any contact",
"addContact": "Añadir\na contactos", "addContact": "Add\nto contacts",
"removeContact": "Eliminar\neste contacto", "removeContact": "Remove\nthis contact",
"derivationsScanProgress": "Escaneado de la dirección {}/{}", "derivationsScanProgress": "Scan address {}/{}",
"youAreOffline": "Estás desconectado...", "youAreOffline": "You are offline...",
"importG1v1": "Importar la cuenta antigua de G1v1", "importG1v1": "Import old G1v1 account",
"selectDestWallet": "Selecciona un monedero destino:", "selectDestWallet": "Select a target wallet:",
"youMustWaitBeforeCashoutThisAccount": "Tienes que esperar unos minutos antes de migrar esta cuenta", "youMustWaitBeforeCashoutThisAccount": "You have to wait a few moment before migrate this account",
"thisAccountIsEmpty": "Esta cuenta está vacía", "thisAccountIsEmpty": "This account is empty",
"youCannotMigrateIdentityToExistingIdentity": "No se puede migrar una identidad\na una cuenta que ya tiene una identidad", "youCannotMigrateIdentityToExistingIdentity": "You cannot migrate an identity\nto an account that already has an identity",
"importOldAccount": "Importar antigua cuenta", "importOldAccount": "Import your old account",
"enterCesiumId": "Ingresa tu frase secreta de Cesium", "enterCesiumId": "Ingrese su ID de Cesium",
"enterCesiumPassword": "Ingresa tu contraseña de Cesium", "enterCesiumPassword": "Ingrese su contraseña de Cesium",
"migrateAccount": "Migrar cuenta", "migrateAccount": "Migrate account",
"migrateIdentity": "Migrar identidad", "migrateIdentity": "Migrate identity",
"identityMigration": "Migración de la identidad", "identityMigration": "Identity migration",
"areYouSureMigrateIdentity": "¿Estás seguro de que quieres migrar permanentemente la identidad **{}** con saldo de **{}**?", "areYouSureMigrateIdentity": "Are you sure you want to permanently migrate identity **{}** with balance of **{}** ?",
"someoneCreatedYourIdentity": "¡ Alguien ha creado tu {} identidad !", "someoneCreatedYourIdentity": "Someone created your {} identity !",
"confirmMyIdentity": "Confirmar mi identidad", "confirmMyIdentity": "Confirmar mi identidad",
"revokeMyIdentity": "Revocar mi identidad", "revokeMyIdentity": "Revocar mi identidad",
"youCannotRevokeThisIdentity": "No puedes revocar esta identidad mientras\nseas miembro de la red de forjadores", "youCannotRevokeThisIdentity": "You cannot revoke this identity while\nit is member of the blacksmiths web",
"showUdAmounts": "Mostrar importes en DU", "showUdAmounts": "Show amounts in UD",
"ud": "{}DU", "ud": "{}UD",
"chooseATargetWallet": "Elige un monedero de destino", "chooseATargetWallet": "Elija una billetera de destino"
"thisMnemonicHasBeenCopiedToClipboard": "This mnemonic has been copied to clipboard",
"smithCantMigrateIdentity":"You can't migrate this identity while you're member of smith web",
"received": "Received",
"sent": "Sent",
"createIdentity": "Create a new \nidentity",
"memberAccountOf": "Account of {}",
"pasteAddress": "Paste address from\nclipboard"
} }

View File

@ -66,13 +66,12 @@
"chooseAnotherPassword": "Choisir un autre code secret", "chooseAnotherPassword": "Choisir un autre code secret",
"iNotedMyPassword": "J'ai noté mon code secret", "iNotedMyPassword": "J'ai noté mon code secret",
"geckoWillCheckPassword": "Gecko va vérifier avec vous si vous avez bien mémorisé votre code secret.\n\nTapez votre code secret dans le champ ci-dessous pour vérifier que vous lavez bien noté.", "geckoWillCheckPassword": "Gecko va vérifier avec vous si vous avez bien mémorisé votre code secret.\n\nTapez votre code secret dans le champ ci-dessous pour vérifier que vous lavez bien noté.",
"yourChestAndWalletWereCreatedSuccessfully": "Top !\n\nVotre coffre et votre premier portefeuille ont été créés avec un immense succès.\n\nFélicitations !", "yourChestAndWalletWereCreatedSuccessfully": "Top !\n\nVotre coffre votre premier portefeuille ont été créés avec un immense succès.\n\nFélicitations !",
"allGood": "Cest tout bon !", "allGood": "Cest tout bon !",
"areYouSureToDeleteWallet": "Êtes-vous sûr de vouloir supprimer le coffre \"{}\" ?", "areYouSureToDeleteWallet": "Êtes-vous sûr de vouloir supprimer le coffre \"{}\" ?",
"areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?", "areYouSureForgetAllChests": "Êtes-vous sûr de vouloir oublier tous vos coffres ?",
"areYouSureToForgetWallet": "Êtes-vous sûr de vouloir oublier le portefeuille \"{}\" ?", "areYouSureToForgetWallet": "Êtes-vous sûr de vouloir oublier le portefeuille \"{}\" ?",
"areYouSureYouWantToCertify1": "Êtes-vous certain de vouloir certifier l'identité :", "areYouSureYouWantToCertify": "Êtes-vous certain de vouloir certifier l'adresse:\n\n{}",
"areYouSureYouWantToCertify2": "ayant pour adresse :",
"yes": "Oui", "yes": "Oui",
"no": "Non", "no": "Non",
"keepYourMnemonicSecret": "Tâchez de garder cette phrase bien secrète, car elle permet à quiconque la connaît daccéder à tous vos portefeuilles.", "keepYourMnemonicSecret": "Tâchez de garder cette phrase bien secrète, car elle permet à quiconque la connaît daccéder à tous vos portefeuilles.",
@ -158,7 +157,7 @@
"hours": "{} heures {}", "hours": "{} heures {}",
"days": "{} jours", "days": "{} jours",
"months": "{} mois", "months": "{} mois",
"certify": "Certifier cette\nidentité", "certify": "Certifier",
"from": "Depuis:", "from": "Depuis:",
"to": "Vers:", "to": "Vers:",
"amount": "Montant:", "amount": "Montant:",
@ -170,7 +169,7 @@
"deleteThisWallet": "Supprimer ce portefeuille", "deleteThisWallet": "Supprimer ce portefeuille",
"cancel": "Annuler", "cancel": "Annuler",
"inBlockchainResult": "Dans la blockchain {}", "inBlockchainResult": "Dans la blockchain {}",
"search": "Rechercher une identité\nou une adresse", "search": "Rechercher",
"currencyNode": "Noeud {} :", "currencyNode": "Noeud {} :",
"contactsManagementWithNbr": "Mes contacts ({})", "contactsManagementWithNbr": "Mes contacts ({})",
"contactsManagement": "Mes contacts", "contactsManagement": "Mes contacts",
@ -181,7 +180,7 @@
"youAreOffline": "Vous êtes hors ligne...", "youAreOffline": "Vous êtes hors ligne...",
"importG1v1": "Importer un ancien compte G1v1", "importG1v1": "Importer un ancien compte G1v1",
"selectDestWallet": "Sélectionnez un portefeuille cible:", "selectDestWallet": "Sélectionnez un portefeuille cible:",
"youMustWaitBeforeCashoutThisAccount": "Vous devez attendre quelques minutes\navant de pouvoir migrer ce compte", "youMustWaitBeforeCashoutThisAccount": "Vous devez attendre quelques minutes avant de pouvoir migrer ce compte",
"thisAccountIsEmpty": "Ce compte est vide", "thisAccountIsEmpty": "Ce compte est vide",
"youCannotMigrateIdentityToExistingIdentity": "Vous ne pouvez pas migrer une identité\nvers un compte disposant déjà d'une identité", "youCannotMigrateIdentityToExistingIdentity": "Vous ne pouvez pas migrer une identité\nvers un compte disposant déjà d'une identité",
"importOldAccount": "Importer son ancien compte", "importOldAccount": "Importer son ancien compte",
@ -197,12 +196,5 @@
"youCannotRevokeThisIdentity": "Vous ne pouvez pas révoquer cette identité tant\nqu'elle fait partie de la toile forgerons", "youCannotRevokeThisIdentity": "Vous ne pouvez pas révoquer cette identité tant\nqu'elle fait partie de la toile forgerons",
"showUdAmounts": "Afficher les montants en DU", "showUdAmounts": "Afficher les montants en DU",
"ud": "{}DU", "ud": "{}DU",
"chooseATargetWallet": "Choisissez un portefeuille cible", "chooseATargetWallet": "Choisissez un portefeuille cible"
"thisMnemonicHasBeenCopiedToClipboard": "Cette phrase secrète viens d'être copié dans votre presse-papier.",
"smithCantMigrateIdentity":"Vous ne pouvez pas migrer cette identité\ntant que vous êtes dans la toile forgerons",
"received": "Reçus",
"sent": "Envoyés",
"createIdentity": "Créer sa nouvelle\nidentité",
"memberAccountOf": "Compte de {}",
"pasteAddress": "Coller l'adresse depuis\nle presse-papier"
} }

View File

@ -26,7 +26,7 @@ void main() async {
await tapKey(keyImportG1v1); await tapKey(keyImportG1v1);
await enterText(keyCesiumId, 'test'); await enterText(keyCesiumId, 'test');
await enterText(keyCesiumPassword, 'test'); await enterText(keyCesiumPassword, 'test');
await waitFor('DCovzCEnQm9GUWe6mr8u42JR1JAuoj3HbQUGdCkfTzSr'); await waitFor(cesiumTest1.shortAddress());
await waitFor('100.0'); await waitFor('100.0');
await waitFor('3', exactMatch: true); await waitFor('3', exactMatch: true);

View File

@ -1,6 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
@ -136,7 +135,7 @@ Future<void> waitFor(String text,
Finder finder = exactMatch ? find.text(text) : find.textContaining(text); Finder finder = exactMatch ? find.text(text) : find.textContaining(text);
log.d('INTEGRATION TEST: Wait for: $text'); log.d('INTEGRATION TEST: Wait for: $text');
final searchType = reverse ? 'reversed text' : 'text'; final String searchType = reverse ? 'reversed text' : 'text';
do { do {
if (DateTime.now().isAfter(end)) { if (DateTime.now().isAfter(end)) {
@ -259,14 +258,14 @@ Future<WalletData> _addImportAccount(
final address = await sub.importAccount( final address = await sub.importAccount(
mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA'); mnemonic: mnemonic, derivePath: '//$derivation', password: 'AAAAA');
final myWallet = WalletData( final myWallet = WalletData(
version: dataVersion,
chest: chest, chest: chest,
address: address, address: address,
number: number, number: number,
name: name, name: name,
derivation: derivation, derivation: derivation,
imageDefaultPath: '${number % 4}.png', imageDefaultPath: '${number % 4}.png');
isOwned: true); await walletBox.add(myWallet);
await walletBox.put(myWallet.address, myWallet);
return myWallet; return myWallet;
} }

View File

@ -7,7 +7,7 @@ import 'package:hive_flutter/hive_flutter.dart';
import 'package:logger/logger.dart'; import 'package:logger/logger.dart';
// Version of box data // Version of box data
const int dataVersion = 6; const int dataVersion = 4;
late String appVersion; late String appVersion;
const int pinLength = 5; const int pinLength = 5;
@ -50,8 +50,3 @@ const debugPin = true;
String indexerEndpoint = ''; String indexerEndpoint = '';
late double balanceRatio; late double balanceRatio;
late int udValue; late int udValue;
// Indexer
late DateTime startBlockchainTime;
late int currentUdIndex;

View File

@ -15,15 +15,13 @@
import 'dart:async'; import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/models/chest_data.dart';
import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/generate_wallets.dart'; import 'package:gecko/providers/generate_wallets.dart';
import 'package:gecko/providers/settings_provider.dart'; import 'package:gecko/providers/settings_provider.dart';
@ -32,6 +30,7 @@ import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/screens/home.dart'; import 'package:gecko/screens/home.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -62,17 +61,29 @@ Future<void> main() async {
await homeProvider.initHive(); await homeProvider.initHive();
appVersion = await homeProvider.getAppVersion(); appVersion = await homeProvider.getAppVersion();
// Reset GraphQL cache
// final cache = HiveStore();
// cache.reset();
// Configure Hive and open boxes // Configure Hive and open boxes
Hive.registerAdapter(WalletDataAdapter()); Hive.registerAdapter(WalletDataAdapter());
Hive.registerAdapter(ChestDataAdapter()); Hive.registerAdapter(ChestDataAdapter());
Hive.registerAdapter(G1WalletsListAdapter()); Hive.registerAdapter(G1WalletsListAdapter());
Hive.registerAdapter(IdAdapter()); Hive.registerAdapter(IdAdapter());
walletBox = await Hive.openBox<WalletData>("walletBox");
chestBox = await Hive.openBox<ChestData>("chestBox"); chestBox = await Hive.openBox<ChestData>("chestBox");
configBox = await Hive.openBox("configBox");
await Hive.deleteBoxFromDisk('g1WalletsBox');
g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
// Reset GraphQL cache await homeProvider.getValidEndpoints();
// final cache = HiveStore(); // await configBox.delete('isCacheChecked');
// cache.reset(); if (configBox.get('isCacheChecked') == null) {
configBox.put('isCacheChecked', false);
}
// log.d(await configBox.get('endpoint'));
HttpOverrides.global = MyHttpOverrides(); HttpOverrides.global = MyHttpOverrides();
@ -87,35 +98,31 @@ Future<void> main() async {
// // ]); // // ]);
// Catcher(rootWidget: Gecko(endPointGVA, _store), debugConfig: debugOptions); // Catcher(rootWidget: Gecko(endPointGVA, _store), debugConfig: debugOptions);
await SentryFlutter.init((options) { await SentryFlutter.init(
(options) {
options.dsn = options.dsn =
'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110'; 'https://c09587b46eaa42e8b9fda28d838ed180@o496840.ingest.sentry.io/5572110';
}, },
appRunner: () => SystemChrome.setPreferredOrientations( appRunner: () => runApp(
[DeviceOrientation.portraitUp]).then((_) { EasyLocalization(
runApp(EasyLocalization(
supportedLocales: const [
Locale('en'),
Locale('fr'),
Locale('es')
],
path: 'assets/translations',
fallbackLocale: const Locale('en'),
child: const Gecko(),
));
}));
} else {
log.i('Debug mode enabled: No sentry alerte');
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp])
.then((_) {
runApp(EasyLocalization(
supportedLocales: const [Locale('en'), Locale('fr'), Locale('es')], supportedLocales: const [Locale('en'), Locale('fr'), Locale('es')],
path: 'assets/translations', path: 'assets/translations',
fallbackLocale: const Locale('en'), fallbackLocale: const Locale('en'),
child: const Gecko(), child: const Gecko(),
)); ),
}); ),
);
} else {
log.i('Debug mode enabled: No sentry alerte');
runApp(
EasyLocalization(
supportedLocales: const [Locale('en'), Locale('fr'), Locale('es')],
path: 'assets/translations',
fallbackLocale: const Locale('en'),
child: const Gecko(),
),
);
} }
} }
@ -124,6 +131,8 @@ class Gecko extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// To configure multi_endpoints GraphQLProvider: https://stackoverflow.com/q/70656513/8301867 // To configure multi_endpoints GraphQLProvider: https://stackoverflow.com/q/70656513/8301867
return MultiProvider( return MultiProvider(

View File

@ -1,5 +1,7 @@
import 'dart:io'; import 'dart:io';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
part 'chest_data.g.dart'; part 'chest_data.g.dart';
@HiveType(typeId: 1) @HiveType(typeId: 1)

View File

@ -56,43 +56,5 @@ query ($address: String!, $number: Int!, $cursor: String) {
} }
'''; ''';
const String getCertsReceived = r''' // To parse indexer date format
query ($address: String!) { // log.d(DateTime.parse("2022-06-13T16:51:24.001+00:00").toString());
certification(where: {receiver: {pubkey: {_eq: $address}}}) {
issuer {
pubkey
name
}
created_at
}
}
''';
const String getCertsSent = r'''
query ($address: String!) {
certification(where: {issuer: {pubkey: {_eq: $address}}}) {
receiver {
pubkey
name
}
created_at
}
}
''';
const String isIdtyExistQ = r'''
query ($name: String!) {
identity(where: {name: {_eq: $name}}) {
name
}
}
''';
const String getBlockchainStartQ = r'''
query {
block(limit: 1) {
created_at
number
}
}
''';

View File

@ -4,42 +4,38 @@ part 'wallet_data.g.dart';
@HiveType(typeId: 0) @HiveType(typeId: 0)
class WalletData extends HiveObject { class WalletData extends HiveObject {
@HiveField(0) @HiveField(0)
String address; int? version;
@HiveField(1) @HiveField(1)
int? chest; int? chest;
@HiveField(2) @HiveField(2)
int? number; String? address;
@HiveField(3) @HiveField(3)
String? name; int? number;
@HiveField(4) @HiveField(4)
int? derivation; String? name;
@HiveField(5) @HiveField(5)
String? imageDefaultPath; int? derivation;
@HiveField(6) @HiveField(6)
String? imageCustomPath; String? imageDefaultPath;
@HiveField(7) @HiveField(7)
bool isOwned; String? imageCustomPath;
@HiveField(8)
bool isMember;
WalletData( WalletData(
{required this.address, {this.version,
this.chest, this.chest,
this.address,
this.number, this.number,
this.name, this.name,
this.derivation, this.derivation,
this.imageDefaultPath, this.imageDefaultPath,
this.imageCustomPath, this.imageCustomPath});
this.isOwned = false,
this.isMember = false});
// representation of WalletData when debugging // representation of WalletData when debugging
@override @override

View File

@ -17,40 +17,37 @@ class WalletDataAdapter extends TypeAdapter<WalletData> {
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(), for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
}; };
return WalletData( return WalletData(
address: fields[0] as String, version: fields[0] as int?,
chest: fields[1] as int?, chest: fields[1] as int?,
number: fields[2] as int?, address: fields[2] as String?,
name: fields[3] as String?, number: fields[3] as int?,
derivation: fields[4] as int?, name: fields[4] as String?,
imageDefaultPath: fields[5] as String?, derivation: fields[5] as int?,
imageCustomPath: fields[6] as String?, imageDefaultPath: fields[6] as String?,
isOwned: fields[7] as bool, imageCustomPath: fields[7] as String?,
isMember: fields[8] as bool,
); );
} }
@override @override
void write(BinaryWriter writer, WalletData obj) { void write(BinaryWriter writer, WalletData obj) {
writer writer
..writeByte(9) ..writeByte(8)
..writeByte(0) ..writeByte(0)
..write(obj.address) ..write(obj.version)
..writeByte(1) ..writeByte(1)
..write(obj.chest) ..write(obj.chest)
..writeByte(2) ..writeByte(2)
..write(obj.number) ..write(obj.address)
..writeByte(3) ..writeByte(3)
..write(obj.name) ..write(obj.number)
..writeByte(4) ..writeByte(4)
..write(obj.derivation) ..write(obj.name)
..writeByte(5) ..writeByte(5)
..write(obj.imageDefaultPath) ..write(obj.derivation)
..writeByte(6) ..writeByte(6)
..write(obj.imageCustomPath) ..write(obj.imageDefaultPath)
..writeByte(7) ..writeByte(7)
..write(obj.isOwned) ..write(obj.imageCustomPath);
..writeByte(8)
..write(obj.isMember);
} }
@override @override

View File

@ -61,9 +61,6 @@ const keyCloseTransactionScreen = Key('keyCloseTransactionScreen');
const keyListTransactions = Key('keyListTransactions'); const keyListTransactions = Key('keyListTransactions');
const keyActivityScreen = Key('keyActivityScreen'); const keyActivityScreen = Key('keyActivityScreen');
// Certification view
const keyCertsReceived = Key('keyCertsReceived');
// Unlock wallet // Unlock wallet
const keyUnlockWallet = Key('keyUnlockWallet'); const keyUnlockWallet = Key('keyUnlockWallet');
const keyPinForm = Key('keyPinForm'); const keyPinForm = Key('keyPinForm');

View File

@ -8,6 +8,8 @@ import 'package:path_provider/path_provider.dart';
class CesiumPlusProvider with ChangeNotifier { class CesiumPlusProvider with ChangeNotifier {
TextEditingController cesiumName = TextEditingController(); TextEditingController cesiumName = TextEditingController();
Image defaultAvatar(double size) =>
Image.asset(('assets/icon_user.png'), height: size);
CancelToken avatarCancelToken = CancelToken(); CancelToken avatarCancelToken = CancelToken();
@ -154,6 +156,3 @@ class CesiumPlusProvider with ChangeNotifier {
return finalAvatar; return finalAvatar;
} }
} }
Image defaultAvatar(double size) =>
Image.asset(('assets/icon_user.png'), height: size);

View File

@ -16,11 +16,11 @@ class ChestProvider with ChangeNotifier {
Future deleteChest(context, ChestData chest) async { Future deleteChest(context, ChestData chest) async {
final bool? answer = await (_confirmDeletingChest(context, chest.name)); final bool? answer = await (_confirmDeletingChest(context, chest.name));
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
if (answer ?? false) { if (answer ?? false) {
await sub.deleteAccounts(getChestWallets(chest)); await sub.deleteAccounts(getChestWallets(chest));
await chestBox.delete(chest.key); await chestBox.delete(chest.key);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
myWalletProvider.pinCode = ''; myWalletProvider.pinCode = '';
@ -45,7 +45,7 @@ class ChestProvider with ChangeNotifier {
log.d(chest.key); log.d(chest.key);
walletBox.toMap().forEach((key, WalletData value) { walletBox.toMap().forEach((key, WalletData value) {
if (value.chest == chest.key) { if (value.chest == chest.key) {
toDelete.add(value.address); toDelete.add(value.address!);
} }
}); });
return toDelete; return toDelete;

View File

@ -5,15 +5,18 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/queries_indexer.dart'; import 'package:gecko/models/queries_indexer.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:truncate/truncate.dart';
class DuniterIndexer with ChangeNotifier { class DuniterIndexer with ChangeNotifier {
Map<String, String?> walletNameIndexer = {}; Map<String, String?> walletNameIndexer = {};
@ -24,7 +27,6 @@ class DuniterIndexer with ChangeNotifier {
List? transBC; List? transBC;
List listIndexerEndpoints = []; List listIndexerEndpoints = [];
bool isLoadingIndexer = false; bool isLoadingIndexer = false;
Map<String, String> idtyStatusCache = {};
void reload() { void reload() {
notifyListeners(); notifyListeners();
@ -153,12 +155,102 @@ class DuniterIndexer with ChangeNotifier {
return indexerEndpoint; return indexerEndpoint;
} }
Widget getNameByAddress(BuildContext context, String address,
[WalletData? wallet,
double size = 20,
bool canEdit = false,
Color color = Colors.black,
FontWeight fontWeight = FontWeight.w400,
FontStyle fontStyle = FontStyle.italic]) {
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
if (indexerEndpoint == '') {
if (wallet == null) {
return const SizedBox();
} else {
if (canEdit) {
return walletOptions.walletName(context, wallet, size, color);
} else {
return walletOptions.walletNameController(context, wallet, size);
}
}
}
final httpLink = HttpLink(
'$indexerEndpoint/v1/graphql',
);
final client = ValueNotifier(
GraphQLClient(
cache: GraphQLCache(store: HiveStore()),
link: httpLink,
),
);
return GraphQLProvider(
client: client,
child: Query(
options: QueryOptions(
document: gql(
getNameByAddressQ), // this is the query string you just created
variables: {
'address': address,
},
// pollInterval: const Duration(seconds: 10),
),
builder: (QueryResult result,
{VoidCallback? refetch, FetchMore? fetchMore}) {
if (result.hasException) {
return Text(result.exception.toString());
}
if (result.isLoading) {
return const Text('Loading');
}
walletNameIndexer[address] =
result.data?['account_by_pk']?['identity']?['name'];
g1WalletsBox.put(
address,
G1WalletsList(
address: address, username: walletNameIndexer[address]));
// log.d(g1WalletsBox.toMap().values.first.username);
if (walletNameIndexer[address] == null) {
if (wallet == null) {
return const SizedBox();
} else {
if (canEdit) {
return walletOptions.walletName(context, wallet, size, color);
} else {
return walletOptions.walletNameController(
context, wallet, size);
}
}
}
return Text(
color == Colors.grey[700]!
? '(${walletNameIndexer[address]!})'
: truncate(walletNameIndexer[address]!, 20),
style: TextStyle(
fontSize: size,
color: color,
fontWeight: fontWeight,
fontStyle: fontStyle,
),
);
}),
);
}
Widget searchIdentity(BuildContext context, String name) { Widget searchIdentity(BuildContext context, String name) {
// WalletOptionsProvider _walletOptions = // WalletOptionsProvider _walletOptions =
// Provider.of<WalletOptionsProvider>(context, listen: false); // Provider.of<WalletOptionsProvider>(context, listen: false);
CesiumPlusProvider cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
WalletsProfilesProvider walletsProfiles = WalletsProfilesProvider walletsProfiles =
Provider.of<WalletsProfilesProvider>(context, listen: false); Provider.of<WalletsProfilesProvider>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
if (indexerEndpoint == '') { if (indexerEndpoint == '') {
return const Text('Aucun résultat'); return const Text('Aucun résultat');
} }
@ -202,11 +294,6 @@ class DuniterIndexer with ChangeNotifier {
return Text('noResult'.tr()); return Text('noResult'.tr());
} }
for (Map profile in identities) {
duniterIndexer.walletNameIndexer
.putIfAbsent(profile['pubkey'], () => profile['name']);
}
double avatarSize = 55; double avatarSize = 55;
return Expanded( return Expanded(
child: ListView(children: <Widget>[ child: ListView(children: <Widget>[
@ -217,7 +304,7 @@ class DuniterIndexer with ChangeNotifier {
key: keySearchResult(profile['pubkey']), key: keySearchResult(profile['pubkey']),
horizontalTitleGap: 40, horizontalTitleGap: 40,
contentPadding: const EdgeInsets.all(5), contentPadding: const EdgeInsets.all(5),
leading: defaultAvatar(avatarSize), leading: cesiumPlusProvider.defaultAvatar(avatarSize),
title: Row(children: <Widget>[ title: Row(children: <Widget>[
Text(getShortPubkey(profile['pubkey']), Text(getShortPubkey(profile['pubkey']),
style: const TextStyle( style: const TextStyle(
@ -234,8 +321,7 @@ class DuniterIndexer with ChangeNotifier {
Column( Column(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Balance( balance(context, profile['pubkey'], 16),
address: profile['pubkey'], size: 16),
]), ]),
]), ]),
), ),
@ -254,7 +340,10 @@ class DuniterIndexer with ChangeNotifier {
walletsProfiles.address = profile['pubkey']; walletsProfiles.address = profile['pubkey'];
return WalletViewScreen( return WalletViewScreen(
address: profile['pubkey'], address: profile['pubkey'],
username: name, username: g1WalletsBox
.get(profile['pubkey'])
?.id
?.username,
avatar: avatar:
g1WalletsBox.get(profile['pubkey'])?.avatar, g1WalletsBox.get(profile['pubkey'])?.avatar,
); );
@ -280,8 +369,8 @@ class DuniterIndexer with ChangeNotifier {
transBC.add(i); transBC.add(i);
transBC[i] = []; transBC[i] = [];
transBC[i].add(DateTime.parse(transaction['created_at'])); transBC[i].add(DateTime.parse(transaction['created_at']));
final amountBrut = transaction['amount']; final int amountBrut = transaction['amount'];
final amount = removeDecimalZero(amountBrut / 100); final double amount = removeDecimalZero(amountBrut / 100);
if (direction == "RECEIVED") { if (direction == "RECEIVED") {
transBC[i].add(transaction['issuer_pubkey']); transBC[i].add(transaction['issuer_pubkey']);
transBC[i].add(transaction['issuer']['identity']?['name'] ?? ''); transBC[i].add(transaction['issuer']['identity']?['name'] ?? '');
@ -354,37 +443,7 @@ class DuniterIndexer with ChangeNotifier {
String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 2); String result = n.toStringAsFixed(n.truncateToDouble() == n ? 0 : 2);
return double.parse(result); return double.parse(result);
} }
}
// checkHistoryResult(
//// Manuals queries // QueryResult<Object?> result, FetchMoreOptions options, String address) {}
Future<bool> isIdtyExist(String name) async {
final variables = <String, dynamic>{
'name': name,
};
final result = await _execQuery(isIdtyExistQ, variables);
return result.data!['identity']?.isEmpty ?? false ? false : true;
}
Future<DateTime> getBlockStart() async {
final result = await _execQuery(getBlockchainStartQ, {});
startBlockchainTime = DateTime.parse(result.data!['block'][0]['created_at']);
return startBlockchainTime;
}
Future<QueryResult> _execQuery(
String query, Map<String, dynamic> variables) async {
final httpLink = HttpLink(
'$indexerEndpoint/v1/graphql',
);
final GraphQLClient client = GraphQLClient(
cache: GraphQLCache(),
link: httpLink,
);
final QueryOptions options =
QueryOptions(document: gql(query), variables: variables);
return await client.query(options);
} }

View File

@ -249,7 +249,7 @@ class GenerateWalletsProvider with ChangeNotifier {
} }
Future<List<String>> generateWordList(BuildContext context) async { Future<List<String>> generateWordList(BuildContext context) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
generatedMnemonic = await sub.generateMnemonic(lang: appLang); generatedMnemonic = await sub.generateMnemonic(lang: appLang);
List<String> wordsList = []; List<String> wordsList = [];
@ -369,7 +369,7 @@ class GenerateWalletsProvider with ChangeNotifier {
} }
Future<bool> scanDerivations(BuildContext context) async { Future<bool> scanDerivations(BuildContext context) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final currentChestNumber = configBox.get('currentChest'); final currentChestNumber = configBox.get('currentChest');
bool isAlive = false; bool isAlive = false;
scanedValidWalletNumber = 0; scanedValidWalletNumber = 0;
@ -414,14 +414,14 @@ class GenerateWalletsProvider with ChangeNotifier {
password: pin.text); password: pin.text);
WalletData myWallet = WalletData( WalletData myWallet = WalletData(
version: dataVersion,
chest: currentChestNumber, chest: currentChestNumber,
address: addressData.address!, address: addressData.address!,
number: scanedValidWalletNumber, number: scanedValidWalletNumber,
name: walletName, name: walletName,
derivation: derivationNbr, derivation: derivationNbr,
imageDefaultPath: '${scanedValidWalletNumber % 4}.png', imageDefaultPath: '${scanedValidWalletNumber % 4}.png');
isOwned: true); await walletBox.add(myWallet);
await walletBox.put(myWallet.address, myWallet);
scanedValidWalletNumber = scanedValidWalletNumber + 1; scanedValidWalletNumber = scanedValidWalletNumber + 1;
} }
scanedWalletNumber = scanedWalletNumber + 1; scanedWalletNumber = scanedWalletNumber + 1;
@ -445,8 +445,6 @@ class GenerateWalletsProvider with ChangeNotifier {
onTimeout: () => {}, onTimeout: () => {},
); );
log.d(balance);
log.d( log.d(
"${addressData.address!}: ${balance['transferableBalance']} $currencyName"); "${addressData.address!}: ${balance['transferableBalance']} $currencyName");
if (balance['transferableBalance'] != 0) { if (balance['transferableBalance'] != 0) {
@ -454,14 +452,14 @@ class GenerateWalletsProvider with ChangeNotifier {
await sub.importAccount(mnemonic: generatedMnemonic!, password: pin.text); await sub.importAccount(mnemonic: generatedMnemonic!, password: pin.text);
WalletData myWallet = WalletData( WalletData myWallet = WalletData(
version: dataVersion,
chest: currentChestNumber, chest: currentChestNumber,
address: addressData.address!, address: addressData.address!,
number: 0, number: 0,
name: walletName, name: walletName,
derivation: -1, derivation: -1,
imageDefaultPath: '0.png', imageDefaultPath: '0.png');
isOwned: true); await walletBox.add(myWallet);
await walletBox.put(myWallet.address, myWallet);
return true; return true;
} else { } else {
return false; return false;

View File

@ -8,11 +8,17 @@ import 'dart:math';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'dart:async'; import 'dart:async';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/screens/search.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb; import 'package:flutter/foundation.dart' show kDebugMode, kIsWeb;
import 'package:path_provider/path_provider.dart' as pp; import 'package:path_provider/path_provider.dart' as pp;
@ -27,7 +33,6 @@ class HomeProvider with ChangeNotifier {
Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850])); Widget appBarTitle = Text('Ğecko', style: TextStyle(color: Colors.grey[850]));
String homeMessage = "loading".tr(); String homeMessage = "loading".tr();
String defaultMessage = "noLizard".tr(); String defaultMessage = "noLizard".tr();
bool isWalletBoxInit = false;
Future<void> initHive() async { Future<void> initHive() async {
late Directory hivePath; late Directory hivePath;
@ -62,11 +67,9 @@ class HomeProvider with ChangeNotifier {
Future changeCurrencyUnit(BuildContext context) async { Future changeCurrencyUnit(BuildContext context) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false); final sub = Provider.of<SubstrateSdk>(context, listen: false);
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
final bool isUdUnit = configBox.get('isUdUnit') ?? false; final bool isUdUnit = configBox.get('isUdUnit') ?? false;
await configBox.put('isUdUnit', !isUdUnit); await configBox.put('isUdUnit', !isUdUnit);
walletOptions.balanceCache = {}; balanceCache = {};
sub.getBalanceRatio(); sub.getBalanceRatio();
notifyListeners(); notifyListeners();
} }
@ -129,6 +132,104 @@ class HomeProvider with ChangeNotifier {
// volume: volume, mode: PlayerMode.LOW_LATENCY, stayAwake: false); // volume: volume, mode: PlayerMode.LOW_LATENCY, stayAwake: false);
// } // }
Widget bottomAppBar(BuildContext context) {
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
WalletsProfilesProvider historyProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false);
final size = MediaQuery.of(context).size;
const bool showBottomBar = true;
return Visibility(
visible: showBottomBar,
child: Container(
color: yellowC,
width: size.width,
height: 80,
child:
// Stack(
// children: [
// // CustomPaint(
// // size: Size(size.width, 110),
// // painter: CustomRoundedButton(),
// // ),
Row(mainAxisAlignment: MainAxisAlignment.start, children: [
// SizedBox(width: 0),
const Spacer(),
const SizedBox(width: 11),
IconButton(
key: keyAppBarSearch,
iconSize: 40,
icon: const Image(image: AssetImage('assets/loupe-noire.png')),
onPressed: () {
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
Navigator.push(
context,
MaterialPageRoute(builder: (homeContext) {
return const SearchScreen();
}),
);
},
),
const SizedBox(width: 22),
const Spacer(),
IconButton(
key: keyAppBarQrcode,
iconSize: 70,
icon: const Image(image: AssetImage('assets/qrcode-scan.png')),
onPressed: () async {
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
historyProvider.scan(homeContext);
},
),
const Spacer(),
const SizedBox(width: 15),
IconButton(
key: keyAppBarChest,
iconSize: 60,
icon: const Image(image: AssetImage('assets/wallet.png')),
onPressed: () async {
WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
String? pin;
if (myWalletProvider.pinCode == '') {
pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (pin != null || myWalletProvider.pinCode != '') {
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
}
},
),
const Spacer(),
]),
),
);
}
void reload() { void reload() {
notifyListeners(); notifyListeners();
} }

View File

@ -15,8 +15,6 @@ class MyWalletsProvider with ChangeNotifier {
bool isNewDerivationLoading = false; bool isNewDerivationLoading = false;
String lastFlyBy = ''; String lastFlyBy = '';
String dragAddress = ''; String dragAddress = '';
bool isPinValid = false;
bool isPinLoading = true;
int getCurrentChest() { int getCurrentChest() {
if (configBox.get('currentChest') == null) { if (configBox.get('currentChest') == null) {
@ -28,7 +26,7 @@ class MyWalletsProvider with ChangeNotifier {
bool checkIfWalletExist() { bool checkIfWalletExist() {
if (chestBox.isEmpty) { if (chestBox.isEmpty) {
// log.i('No wallets detected'); log.i('No wallets detected');
return false; return false;
} else { } else {
return true; return true;
@ -48,7 +46,7 @@ class MyWalletsProvider with ChangeNotifier {
} }
WalletData? getWalletDataById(List<int?> id) { WalletData? getWalletDataById(List<int?> id) {
if (id.isEmpty) return WalletData(address: '', isOwned: true); if (id.isEmpty) return WalletData();
int? chest = id[0]; int? chest = id[0];
int? nbr = id[1]; int? nbr = id[1];
WalletData? targetedWallet; WalletData? targetedWallet;
@ -78,18 +76,18 @@ class MyWalletsProvider with ChangeNotifier {
WalletData getDefaultWallet([int? chest]) { WalletData getDefaultWallet([int? chest]) {
if (chestBox.isEmpty) { if (chestBox.isEmpty) {
return WalletData(address: '', chest: 0, number: 0, isOwned: true); return WalletData(chest: 0, number: 0);
} else { } else {
chest ??= getCurrentChest(); chest ??= getCurrentChest();
int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet; int? defaultWalletNumber = chestBox.get(chest)!.defaultWallet;
return getWalletDataById([chest, defaultWalletNumber]) ?? return getWalletDataById([chest, defaultWalletNumber]) ??
WalletData(address: '', chest: chest, number: 0, isOwned: true); WalletData(chest: chest, number: 0);
} }
} }
Future<int> deleteAllWallet(context) async { Future<int> deleteAllWallet(context) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
try { try {
log.w('DELETE ALL WALLETS ?'); log.w('DELETE ALL WALLETS ?');
@ -126,30 +124,30 @@ class MyWalletsProvider with ChangeNotifier {
int? chest = getCurrentChest(); int? chest = getCurrentChest();
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
WalletData defaultWallet = getDefaultWallet(); WalletData defaultWallet = getDefaultWallet();
final address = await sub.derive( final address = await sub.derive(
context, defaultWallet.address, newDerivationNbr, pinCode); context, defaultWallet.address!, newDerivationNbr, pinCode);
WalletData newWallet = WalletData( WalletData newWallet = WalletData(
version: dataVersion,
chest: chest, chest: chest,
address: address, address: address,
number: newWalletNbr, number: newWalletNbr,
name: name, name: name,
derivation: newDerivationNbr, derivation: newDerivationNbr,
imageDefaultPath: '${newWalletNbr % 4}.png', imageDefaultPath: '${newWalletNbr % 4}.png');
isOwned: true);
await walletBox.put(newWallet.address, newWallet); await walletBox.add(newWallet);
isNewDerivationLoading = false; isNewDerivationLoading = false;
notifyListeners(); notifyListeners();
} }
Future<void> generateRootWallet(context, String name) async { Future<void> generateRootWallet(context, String name) async {
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
isNewDerivationLoading = true; isNewDerivationLoading = true;
@ -158,32 +156,29 @@ class MyWalletsProvider with ChangeNotifier {
int? chest = getCurrentChest(); int? chest = getCurrentChest();
List<WalletData> walletConfig = readAllWallets(chest); List<WalletData> walletConfig = readAllWallets(chest);
walletConfig.sort((p1, p2) {
return Comparable.compare(p1.number!, p2.number!);
});
if (walletConfig.isEmpty) { if (walletConfig.isEmpty) {
newWalletNbr = 0; newWalletNbr = 0;
} else { } else {
newWalletNbr = walletConfig.last.number! + 1; newWalletNbr = walletConfig.last.number! + 1;
} }
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
WalletData defaultWallet = myWalletProvider.getDefaultWallet(); WalletData defaultWallet = myWalletProvider.getDefaultWallet();
final address = final address =
await sub.generateRootKeypair(defaultWallet.address, pinCode); await sub.generateRootKeypair(defaultWallet.address!, pinCode);
WalletData newWallet = WalletData( WalletData newWallet = WalletData(
version: dataVersion,
chest: chest, chest: chest,
address: address, address: address,
number: newWalletNbr, number: newWalletNbr,
name: name, name: name,
derivation: -1, derivation: -1,
imageDefaultPath: '${newWalletNbr % 4}.png', imageDefaultPath: '${newWalletNbr % 4}.png');
isOwned: true);
await walletBox.put(newWallet.address, newWallet); await walletBox.add(newWallet);
isNewDerivationLoading = false; isNewDerivationLoading = false;
notifyListeners(); notifyListeners();
@ -197,9 +192,6 @@ class MyWalletsProvider with ChangeNotifier {
chestNumber ??= getCurrentChest(); chestNumber ??= getCurrentChest();
List<WalletData> walletConfig = readAllWallets(chestNumber); List<WalletData> walletConfig = readAllWallets(chestNumber);
walletConfig.sort((p1, p2) {
return Comparable.compare(p1.number!, p2.number!);
});
if (walletConfig.isEmpty) { if (walletConfig.isEmpty) {
newDerivationNbr = 2; newDerivationNbr = 2;

View File

@ -68,7 +68,8 @@ class SearchProvider with ChangeNotifier {
// } // }
Future<List<G1WalletsList>> searchAddress() async { Future<List<G1WalletsList>> searchAddress() async {
final walletProfiles = WalletsProfilesProvider('pubkey'); final WalletsProfilesProvider walletProfiles =
WalletsProfilesProvider('pubkey');
if (walletProfiles.isAddress(searchController.text)) { if (walletProfiles.isAddress(searchController.text)) {
G1WalletsList wallet = G1WalletsList(address: searchController.text); G1WalletsList wallet = G1WalletsList(address: searchController.text);

View File

@ -1,7 +1,6 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:fast_base58/fast_base58.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
@ -11,7 +10,6 @@ import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:pinenacl/ed25519.dart';
import 'package:polkawallet_sdk/api/apiKeyring.dart'; import 'package:polkawallet_sdk/api/apiKeyring.dart';
import 'package:polkawallet_sdk/api/types/networkParams.dart'; import 'package:polkawallet_sdk/api/types/networkParams.dart';
import 'package:polkawallet_sdk/api/types/txInfoData.dart'; import 'package:polkawallet_sdk/api/types/txInfoData.dart';
@ -41,11 +39,9 @@ class SubstrateSdk with ChangeNotifier {
TextEditingController csSalt = TextEditingController(); TextEditingController csSalt = TextEditingController();
TextEditingController csPassword = TextEditingController(); TextEditingController csPassword = TextEditingController();
String g1V1NewAddress = ''; String g1V1NewAddress = '';
String g1V1OldPubkey = '';
bool isCesiumIDVisible = false; bool isCesiumIDVisible = false;
bool isCesiumAddresLoading = false; bool isCesiumAddresLoading = false;
late int udValue; late int udValue;
Map<String, List<int>> certsCounterCache = {};
///////////////////////////////////// /////////////////////////////////////
////////// 1: API METHODS /////////// ////////// 1: API METHODS ///////////
@ -126,20 +122,12 @@ class SubstrateSdk with ChangeNotifier {
return await _getStorage('identity.identityIndexOf("$address")') ?? 0; return await _getStorage('identity.identityIndexOf("$address")') ?? 0;
} }
Future<List<int>> getCertsCounter(String address) async { Future<List<int>> getCerts(String address) async {
final idtyIndex = await _getIdentityIndexOf(address); final idtyIndex = await _getIdentityIndexOf(address);
final certsReceiver = final certsReceiver =
await _getStorage('cert.storageIdtyCertMeta($idtyIndex)') ?? []; await _getStorage('cert.storageIdtyCertMeta($idtyIndex)') ?? [];
if (certsCounterCache[address] == null) { return [certsReceiver['receivedCount'], certsReceiver['issuedCount']];
certsCounterCache.putIfAbsent(address, () => []);
}
certsCounterCache.update(
address,
(value) =>
[certsReceiver['receivedCount'], certsReceiver['issuedCount']]);
return certsCounterCache[address]!;
} }
Future<int> getCertValidityPeriod(String from, String to) async { Future<int> getCertValidityPeriod(String from, String to) async {
@ -180,7 +168,7 @@ class SubstrateSdk with ChangeNotifier {
} }
Future<Map<String, double>> getBalance(String address) async { Future<Map<String, double>> getBalance(String address) async {
log.d('BALANCE: $address'); // log.d('currencyParameters: $currencyParameters');
if (!nodeConnected) { if (!nodeConnected) {
return { return {
@ -198,11 +186,13 @@ class SubstrateSdk with ChangeNotifier {
final Map? idtyData = idtyIndex == null final Map? idtyData = idtyIndex == null
? null ? null
: await _getStorage('identity.identities($idtyIndex)'); : await _getStorage('identity.identities($idtyIndex)');
final int currentUdIndex =
int.parse(await _getStorage('universalDividend.currentUdIndex()'));
final List pastReevals = final List pastReevals =
await _getStorage('universalDividend.pastReevals()'); await _getStorage('universalDividend.pastReevals()');
// Compute amount of claimable UDs // Compute amount of claimable UDs
final int unclaimedUds = _computeUnclaimUds( final int unclaimedUds = _computeUnclaimUds(currentUdIndex,
idtyData?['data']?['firstEligibleUd'] ?? 0, pastReevals); idtyData?['data']?['firstEligibleUd'] ?? 0, pastReevals);
// Calculate transferable and potential balance // Calculate transferable and potential balance
@ -224,7 +214,8 @@ class SubstrateSdk with ChangeNotifier {
return finalBalances; return finalBalances;
} }
int _computeUnclaimUds(int firstEligibleUd, List pastReevals) { int _computeUnclaimUds(
int currentUdIndex, int firstEligibleUd, List pastReevals) {
int totalAmount = 0; int totalAmount = 0;
if (firstEligibleUd == 0) return 0; if (firstEligibleUd == 0) return 0;
@ -248,13 +239,8 @@ class SubstrateSdk with ChangeNotifier {
return totalAmount; return totalAmount;
} }
Future<bool> isMember(String address) async { Future<bool> isMemberGet(String address) async {
final isMember = await idtyStatus(address) == 'Validated'; return await idtyStatus(address) == 'Validated';
final walletData = walletBox.get(address) ?? WalletData(address: address);
walletData.isMember = isMember;
walletBox.put(address, walletData);
// notifyListeners();
return isMember;
} }
Future<bool> isSmithGet(String address) async { Future<bool> isSmithGet(String address) async {
@ -274,7 +260,7 @@ class SubstrateSdk with ChangeNotifier {
Map<String, int> result = {}; Map<String, int> result = {};
final toStatus = await idtyStatus(to); final toStatus = await idtyStatus(to);
if (from != to && await isMember(from)) { if (from != to && await isMemberGet(from)) {
final removableOn = await getCertValidityPeriod(from, to); final removableOn = await getCertValidityPeriod(from, to);
final certMeta = await getCertMeta(from); final certMeta = await getCertMeta(from);
final int nextIssuableOn = certMeta['nextIssuableOn'] ?? 0; final int nextIssuableOn = certMeta['nextIssuableOn'] ?? 0;
@ -289,9 +275,6 @@ class SubstrateSdk with ChangeNotifier {
result.putIfAbsent('certDelay', () => certDelayDuration); result.putIfAbsent('certDelay', () => certDelayDuration);
} else if (toStatus == 'Created') { } else if (toStatus == 'Created') {
result.putIfAbsent('toStatus', () => 1); result.putIfAbsent('toStatus', () => 1);
} else if (toStatus == 'noid') {
result.putIfAbsent('toStatus', () => 2);
result.putIfAbsent('canCert', () => 0);
} else { } else {
result.putIfAbsent('canCert', () => 0); result.putIfAbsent('canCert', () => 0);
} }
@ -312,7 +295,7 @@ class SubstrateSdk with ChangeNotifier {
} }
Future<String> idtyStatus(String address) async { Future<String> idtyStatus(String address) async {
// final walletOptions = // WalletOptionsProvider walletOptions =
// Provider.of<WalletOptionsProvider>(homeContext, listen: false); // Provider.of<WalletOptionsProvider>(homeContext, listen: false);
var idtyIndex = await _getIdentityIndexOf(address); var idtyIndex = await _getIdentityIndexOf(address);
@ -336,15 +319,6 @@ class SubstrateSdk with ChangeNotifier {
} }
} }
Future<bool> isSmith(String address) async {
var idtyIndex = await _getIdentityIndexOf(address);
if (idtyIndex == 0) return false;
final isSmith =
await _getStorage('smithsMembership.membership($idtyIndex)');
return isSmith == null ? false : true;
}
Future<String> getGenesisHash() async { Future<String> getGenesisHash() async {
final String genesisHash = await sdk.webView!.evalJavascript( final String genesisHash = await sdk.webView!.evalJavascript(
'api.genesisHash.toHex()', 'api.genesisHash.toHex()',
@ -406,77 +380,6 @@ class SubstrateSdk with ChangeNotifier {
return estimateFees.partialFee / 100; return estimateFees.partialFee / 100;
} }
int hexStringToUint16(String input) {
// Slice the string in 2-char substrings and parse it from hex to decimal
final bytes = sliceString(input, 2).map((s) => int.parse(s, radix: 16));
// Create a Uint8 from the 2-bytes list
final u8list = Uint8List.fromList(bytes.toList());
// Return a Uint16 little endian representation
return ByteData.view(u8list.buffer).getUint16(0, Endian.little);
}
List<String> sliceString(String input, int count) {
if (input.isEmpty) return [];
if (input.length % count != 0) {
throw ArgumentError("Cannot slice $input in $count slices.");
}
// final slices = List<String>(count);
var slices = List<String>.filled(count, '');
int len = input.length;
int sliceSize = len ~/ count;
for (var i = 0; i < count; i++) {
var start = i * sliceSize;
slices[i] = input.substring(start, start + sliceSize);
}
return List.unmodifiable(slices);
}
Future<DateFormat> getBlockchainStart() async {
////// Manu indexer
//// Extract block date. Ugly, I can't find a better way to get the date of the block ?
//// The only polkadot issue for that : https://github.com/polkadot-js/api/issues/2603
// const created_at = new Date(
// signedBlock.block.extrinsics
// .filter(
// ({ method: { section, method } }) =>
// section === 'timestamp' && method === 'set'
// )[0]
// .args[0].toNumber()
// )
//// manu rpc
// genesis: api.genesisHash.toHex(),
// chain: await api.rpc.chain.getHeader(),
// chainInfo: await api.registry.getChainProperties(),
// test: await api.rpc.state.getPairs('0x')
// query block finalisé qui ne change jamais.
// api.rpc.chain.subscribeFinalizedHeads
// events: await api.rpc.state.getStorage('0x26aa394eea5630e07c48ae0c9558cef780d41e5e16056765bc8461851072c9d7'),
// lastFinalizedBlock: await api.rpc.chain.getFinalizedHead()
// get block
// api.rpc.chain.getFinalizedHead
// shit
// final blockHash =
// await sdk.webView!.evalJavascript('api.rpc.chain.getBlockHash(1)');
// final Map blockContent = await sdk.webView!
// .evalJavascript('api.rpc.chain.getBlock("$blockHash")');
// final String dateBrut = blockContent['block']['extrinsics'][0];
// final dateTextByte = hex.decode(dateBrut.substring(2));
// final dateText = await sdk.webView!
// .evalJavascript('api.tx($dateTextByte)', wrapPromise: false);
// log.d('aaaaaaaaaaaaaaaaaaaaa: $dateText');
return DateFormat();
}
///////////////////////////////////// /////////////////////////////////////
////// 3: SUBSTRATE CONNECTION ////// ////// 3: SUBSTRATE CONNECTION //////
///////////////////////////////////// /////////////////////////////////////
@ -497,8 +400,9 @@ class SubstrateSdk with ChangeNotifier {
} }
Future<void> connectNode(BuildContext ctx) async { Future<void> connectNode(BuildContext ctx) async {
final homeProvider = Provider.of<HomeProvider>(ctx, listen: false); HomeProvider homeProvider = Provider.of<HomeProvider>(ctx, listen: false);
final myWalletProvider = Provider.of<MyWalletsProvider>(ctx, listen: false); MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(ctx, listen: false);
homeProvider.changeMessage("connectionPending".tr(), 0); homeProvider.changeMessage("connectionPending".tr(), 0);
@ -538,8 +442,8 @@ class SubstrateSdk with ChangeNotifier {
} }
notifyListeners(); notifyListeners();
}); });
currentUdIndex =
int.parse(await _getStorage('universalDividend.currentUdIndex()')); await initCurrencyParameters();
await getBalanceRatio(); await getBalanceRatio();
notifyListeners(); notifyListeners();
@ -664,7 +568,7 @@ class SubstrateSdk with ChangeNotifier {
Future<KeyPairData?> changePassword(BuildContext context, String address, Future<KeyPairData?> changePassword(BuildContext context, String address,
String passOld, String passNew) async { String passOld, String passNew) async {
final account = getKeypair(address); final account = getKeypair(address);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
keyring.setCurrent(account); keyring.setCurrent(account);
myWalletProvider.resetPinCode(); myWalletProvider.resetPinCode();
@ -700,7 +604,7 @@ class SubstrateSdk with ChangeNotifier {
await chestBox.put(currentChestNumber, newChestData); await chestBox.put(currentChestNumber, newChestData);
try { try {
final acc = getKeypair(wallet.address); final acc = getKeypair(wallet.address!);
keyring.setCurrent(acc); keyring.setCurrent(acc);
return acc.address!; return acc.address!;
} catch (e) { } catch (e) {
@ -776,9 +680,6 @@ class SubstrateSdk with ChangeNotifier {
cryptoType: CryptoType.ed25519, cryptoType: CryptoType.ed25519,
rawSeed: rawSeedHex); rawSeed: rawSeedHex);
SigningKey rootKey = SigningKey(seed: rawSeed);
g1V1OldPubkey = Base58Encode(rootKey.publicKey);
g1V1NewAddress = newAddress.address!; g1V1NewAddress = newAddress.address!;
notifyListeners(); notifyListeners();
return g1V1NewAddress; return g1V1NewAddress;
@ -794,15 +695,8 @@ class SubstrateSdk with ChangeNotifier {
final fromHasConsumer = final fromHasConsumer =
fromAddress == '' ? false : await hasAccountConsumers(fromAddress); fromAddress == '' ? false : await hasAccountConsumers(fromAddress);
final toIdtyStatus = await idtyStatus(toAddress); final toIdtyStatus = await idtyStatus(toAddress);
final isSmithData = await isSmith(fromAddress);
return [ return [fromBalance, fromIdtyStatus, toIdtyStatus, fromHasConsumer];
fromBalance,
fromIdtyStatus,
toIdtyStatus,
fromHasConsumer,
isSmithData
];
} }
////////////////////////////////////// //////////////////////////////////////
@ -885,7 +779,7 @@ class SubstrateSdk with ChangeNotifier {
List txOptions = []; List txOptions = [];
String? rawParams; String? rawParams;
final toCerts = await getCertsCounter(destAddress); final toCerts = await getCerts(destAddress);
// log.d('debug: ${currencyParameters['minCertForMembership']}'); // log.d('debug: ${currencyParameters['minCertForMembership']}');
@ -1113,7 +1007,7 @@ void snackNode(BuildContext context, bool isConnected) {
if (!isConnected) { if (!isConnected) {
message = "noDuniterNodeAvailableTryLater".tr(); message = "noDuniterNodeAvailableTryLater".tr();
} else { } else {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
message = message =
"${"youAreConnectedToNode".tr()}\n${sub.getConnectedEndpoint()!.split('//')[1]}"; "${"youAreConnectedToNode".tr()}\n${sub.getConnectedEndpoint()!.split('//')[1]}";

View File

@ -11,12 +11,14 @@ import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/animated_text.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:image_cropper/image_cropper.dart'; import 'package:image_cropper/image_cropper.dart';
import 'package:truncate/truncate.dart';
class WalletOptionsProvider with ChangeNotifier { class WalletOptionsProvider with ChangeNotifier {
TextEditingController address = TextEditingController(); TextEditingController address = TextEditingController();
@ -26,11 +28,12 @@ class WalletOptionsProvider with ChangeNotifier {
TextEditingController newPin = TextEditingController(); TextEditingController newPin = TextEditingController();
bool isEditing = false; bool isEditing = false;
bool isBalanceBlur = false; bool isBalanceBlur = false;
FocusNode walletNameFocus = FocusNode();
TextEditingController nameController = TextEditingController(); TextEditingController nameController = TextEditingController();
late bool isDefaultWallet; late bool isDefaultWallet;
bool canValidateNameBool = false; bool canValidateNameBool = false;
Map<String, String> idtyStatusCache = {};
Future<NewWallet>? get badWallet => null; Future<NewWallet>? get badWallet => null;
Map<String, double> balanceCache = {};
int getPinLenght(walletNbr) { int getPinLenght(walletNbr) {
return pinLength; return pinLength;
@ -48,27 +51,27 @@ class WalletOptionsProvider with ChangeNotifier {
} }
Future<int> deleteWallet(context, WalletData wallet) async { Future<int> deleteWallet(context, WalletData wallet) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final bool? answer = await (confirmPopup( final bool? answer = await (confirmPopup(
context, 'areYouSureToForgetWallet'.tr(args: [wallet.name!]))); context, 'areYouSureToForgetWallet'.tr(args: [wallet.name!])));
if (answer ?? false) { if (answer ?? false) {
//Check if balance is null //Check if balance is null
final balance = await sub.getBalance(wallet.address); final balance = await sub.getBalance(wallet.address!);
if (balance != {}) { if (balance != {}) {
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final defaultWallet = myWalletProvider.getDefaultWallet(); final defaultWallet = myWalletProvider.getDefaultWallet();
log.d(defaultWallet.address); log.d(defaultWallet.address);
sub.pay( sub.pay(
fromAddress: wallet.address, fromAddress: wallet.address!,
destAddress: defaultWallet.address, destAddress: defaultWallet.address!,
amount: -1, amount: -1,
password: myWalletProvider.pinCode); password: myWalletProvider.pinCode);
} }
await walletBox.delete(wallet.key); await walletBox.delete(wallet.key);
await sub.deleteAccounts([wallet.address]); await sub.deleteAccounts([wallet.address!]);
Navigator.pop(context); Navigator.pop(context);
} }
@ -129,17 +132,98 @@ class WalletOptionsProvider with ChangeNotifier {
} }
} }
Widget idtyStatus(BuildContext context, String address,
{bool isOwner = false, Color color = Colors.black}) {
DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
showText(String text,
[double size = 18, bool bold = false, bool smooth = true]) {
log.d('$address $text');
return AnimatedFadeOutIn<String>(
data: text,
duration: Duration(milliseconds: smooth ? 200 : 0),
builder: (value) => Text(
value,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: size,
color: bold ? color : Colors.black,
fontWeight: bold ? FontWeight.w500 : FontWeight.w400),
),
);
}
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder(
future: sub.idtyStatus(address),
initialData: '',
builder: (context, snapshot) {
idtyStatusCache[address] = snapshot.data.toString();
switch (snapshot.data.toString()) {
case 'noid':
{
return showText('noIdentity'.tr());
}
case 'Created':
{
return showText('identityCreated'.tr());
}
case 'ConfirmedByOwner':
{
return isOwner
? showText('identityConfirmed'.tr())
: duniterIndexer.getNameByAddress(
context,
address,
null,
20,
true,
Colors.grey[700]!,
FontWeight.w500,
FontStyle.italic);
}
case 'Validated':
{
return isOwner
? showText('memberValidated'.tr(), 18, true)
: duniterIndexer.getNameByAddress(
context,
address,
null,
20,
true,
Colors.black,
FontWeight.w600,
FontStyle.normal);
}
case 'expired':
{
return showText('identityExpired'.tr());
}
}
return SizedBox(
child: showText('', 18, false, false),
);
});
});
}
Future<bool> isMember(BuildContext context, String address) async {
SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
return await sub.idtyStatus(address) == 'Validated';
}
Future<String?> confirmIdentityPopup(BuildContext context) async { Future<String?> confirmIdentityPopup(BuildContext context) async {
TextEditingController idtyName = TextEditingController(); TextEditingController idtyName = TextEditingController();
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final walletOptions = WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false); Provider.of<WalletOptionsProvider>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
bool canValidate = false;
bool idtyExist = false;
return showDialog<String>( return showDialog<String>(
context: context, context: context,
barrierDismissible: true, // user must tap button! barrierDismissible: true, // user must tap button!
@ -156,16 +240,7 @@ class WalletOptionsProvider with ChangeNotifier {
const SizedBox(height: 20), const SizedBox(height: 20),
TextField( TextField(
key: keyEnterIdentityUsername, key: keyEnterIdentityUsername,
onChanged: (_) async { onChanged: (_) => notifyListeners(),
idtyExist = await isIdtyExist(idtyName.text);
canValidate = !idtyExist &&
!await isIdtyExist(idtyName.text) &&
idtyName.text.length >= 2 &&
idtyName.text.length <= 32;
log.d('aaaaaaaaaa: $canValidate');
notifyListeners();
},
inputFormatters: <TextInputFormatter>[ inputFormatters: <TextInputFormatter>[
// FilteringTextInputFormatter.allow(RegExp("[0-9a-zA-Z]")), // FilteringTextInputFormatter.allow(RegExp("[0-9a-zA-Z]")),
FilteringTextInputFormatter.deny(RegExp(r'^ ')), FilteringTextInputFormatter.deny(RegExp(r'^ ')),
@ -175,12 +250,7 @@ class WalletOptionsProvider with ChangeNotifier {
autofocus: true, autofocus: true,
controller: idtyName, controller: idtyName,
style: const TextStyle(fontSize: 19), style: const TextStyle(fontSize: 19),
), )
const SizedBox(height: 10),
Consumer<WalletOptionsProvider>(builder: (context, wOptions, _) {
return Text(idtyExist ? 'Cette identité existe déjà' : '',
style: TextStyle(color: Colors.red[500]));
})
]), ]),
), ),
actions: <Widget>[ actions: <Widget>[
@ -191,12 +261,20 @@ class WalletOptionsProvider with ChangeNotifier {
builder: (context, wOptions, _) { builder: (context, wOptions, _) {
return TextButton( return TextButton(
key: keyConfirm, key: keyConfirm,
onPressed: canValidate child: Text(
? () async { "validate".tr(),
idtyName.text = style: TextStyle(
idtyName.text.trim().replaceAll(' ', ''); fontSize: 21,
color: idtyName.text.length.clamp(3, 64) ==
idtyName.text.length
? const Color(0xffD80000)
: Colors.grey,
),
),
onPressed: () async {
idtyName.text = idtyName.text.trim().replaceAll(' ', '');
if (idtyName.text.length.clamp(3, 32) == if (idtyName.text.length.clamp(3, 64) ==
idtyName.text.length) { idtyName.text.length) {
WalletData? defaultWallet = WalletData? defaultWallet =
myWalletProvider.getDefaultWallet(); myWalletProvider.getDefaultWallet();
@ -207,14 +285,12 @@ class WalletOptionsProvider with ChangeNotifier {
context, context,
MaterialPageRoute( MaterialPageRoute(
builder: (homeContext) { builder: (homeContext) {
return UnlockingWallet( return UnlockingWallet(wallet: defaultWallet);
wallet: defaultWallet);
}, },
), ),
); );
} }
if (pin != null || if (pin != null || myWalletProvider.pinCode != '') {
myWalletProvider.pinCode != '') {
final wallet = myWalletProvider final wallet = myWalletProvider
.getWalletDataByAddress(address.text); .getWalletDataByAddress(address.text);
await sub.setCurrentWallet(wallet!); await sub.setCurrentWallet(wallet!);
@ -227,29 +303,19 @@ class WalletOptionsProvider with ChangeNotifier {
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return TransactionInProgress( return TransactionInProgress(
transType: 'comfirmIdty', transType: 'comfirmIdty',
fromAddress: fromAddress: getShortPubkey(wallet.address!),
getShortPubkey(wallet.address), toAddress: getShortPubkey(wallet.address!),
toAddress: getShortPubkey(wallet.address),
); );
}), }),
); );
} }
} }
} },
: null,
child: Text(
"validate".tr(),
style: TextStyle(
fontSize: 21,
color: canValidate
? const Color(0xffD80000)
: Colors.grey[500]),
),
); );
}) })
], ],
), ),
const SizedBox(height: 5) const SizedBox(height: 20)
], ],
); );
}, },
@ -305,7 +371,7 @@ class WalletOptionsProvider with ChangeNotifier {
if (canValidateNameBool) { if (canValidateNameBool) {
nameController.text = walletName.text; nameController.text = walletName.text;
_renameWallet(wID, walletName.text, isCesium: false); _renameWallet(wID, walletName.text, isCesium: false);
notifyListeners(); // notifyListeners();
Navigator.pop(context); Navigator.pop(context);
} }
}, },
@ -339,7 +405,7 @@ class WalletOptionsProvider with ChangeNotifier {
} }
bool canValidateName(BuildContext context, TextEditingController walletName) { bool canValidateName(BuildContext context, TextEditingController walletName) {
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
bool isNameValid = walletName.text.length >= 2 && bool isNameValid = walletName.text.length >= 2 &&
@ -375,7 +441,7 @@ class WalletOptionsProvider with ChangeNotifier {
String? addressGet; String? addressGet;
walletBox.toMap().forEach((key, value) { walletBox.toMap().forEach((key, value) {
if (value.chest == chest && value.derivation == derivation) { if (value.chest == chest && value.derivation == derivation) {
addressGet = value.address; addressGet = value.address!;
return; return;
} }
}); });
@ -384,4 +450,190 @@ class WalletOptionsProvider with ChangeNotifier {
return addressGet; return addressGet;
} }
Widget walletNameController(BuildContext context, WalletData wallet,
[double size = 20]) {
nameController.text = wallet.name!;
return SizedBox(
width: 260,
child: Stack(children: <Widget>[
TextField(
key: keyWalletName,
autofocus: false,
focusNode: walletNameFocus,
enabled: isEditing,
controller: nameController,
minLines: 1,
maxLines: 3,
textAlign: TextAlign.center,
decoration: const InputDecoration(
border: InputBorder.none,
focusedBorder: InputBorder.none,
enabledBorder: InputBorder.none,
disabledBorder: InputBorder.none,
contentPadding: EdgeInsets.all(15.0),
),
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
color: Colors.black,
fontWeight: FontWeight.w400,
),
),
Positioned(
right: 0,
child: InkWell(
key: keyRenameWallet,
onTap: () async {
// _isNewNameValid =
// walletProvider.editWalletName(wallet.id(), isCesium: false);
await editWalletName(context, wallet.id());
await Future.delayed(const Duration(milliseconds: 30));
walletNameFocus.requestFocus();
},
child: ClipRRect(
child: Image.asset(
isEditing
? 'assets/walletOptions/android-checkmark.png'
: 'assets/walletOptions/edit.png',
width: 25,
height: 25),
),
),
),
]),
);
}
Widget walletName(BuildContext context, WalletData wallet,
[double size = 20, Color color = Colors.black]) {
double newSize = wallet.name!.length <= 15 ? size : size - 2;
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Text(
truncate(wallet.name!, 20),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: isTall ? newSize : newSize * 0.9,
color: color,
fontWeight: FontWeight.w400,
fontStyle: FontStyle.italic,
),
softWrap: false,
overflow: TextOverflow.ellipsis,
),
]);
}
}
Map<String, double> balanceCache = {};
Widget balance(BuildContext context, String address, double size,
[Color color = Colors.black,
Color loadingColor = const Color(0xffd07316)]) {
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getBalance(address),
builder: (BuildContext context,
AsyncSnapshot<Map<String, double>> globalBalance) {
if (globalBalance.connectionState != ConnectionState.done ||
globalBalance.hasError) {
if (balanceCache[address] != null &&
balanceCache[address] != -1) {
return Row(children: [
Text(balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9, color: color)),
const SizedBox(width: 5),
udUnitDisplay(size, color),
]);
} else {
return SizedBox(
height: 15,
width: 15,
child: CircularProgressIndicator(
color: loadingColor,
strokeWidth: 2,
),
);
}
}
balanceCache[address] = globalBalance.data!['transferableBalance']!;
if (balanceCache[address] != -1) {
return Row(children: [
Text(
balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
color: color,
),
),
const SizedBox(width: 5),
udUnitDisplay(size, color),
]);
} else {
return const Text('');
}
});
}),
]);
}
Widget getCerts(BuildContext context, String address, double size,
[Color color = Colors.black]) {
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getCerts(address),
builder: (BuildContext context, AsyncSnapshot<List<int>> certs) {
// log.d(_certs.data);
return certs.data?[0] != 0 && certs.data != null
? Row(
children: [
Image.asset('assets/medal.png', height: 20),
const SizedBox(width: 1),
Text(certs.data?[0].toString() ?? '0',
style: const TextStyle(fontSize: 20)),
const SizedBox(width: 5),
Text(
"(${certs.data?[1].toString() ?? '0'})",
style: const TextStyle(fontSize: 14),
)
],
)
: const Text('');
});
}),
]);
}
Widget udUnitDisplay(double size, [Color color = Colors.black]) {
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
return isUdUnit
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
'ud'.tr(args: ['']),
style:
TextStyle(fontSize: isTall ? size : size * 0.9, color: color),
),
Column(
children: [
Text(
currencyName,
style: TextStyle(
fontSize: (isTall ? size : size * 0.9) * 0.7,
fontWeight: FontWeight.w500,
color: color),
),
const SizedBox(height: 15)
],
)
],
)
: Text(currencyName,
style: TextStyle(fontSize: isTall ? size : size * 0.9, color: color));
} }

View File

@ -1,13 +1,20 @@
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:jdenticon_dart/jdenticon_dart.dart'; import 'package:jdenticon_dart/jdenticon_dart.dart';
import 'package:permission_handler/permission_handler.dart'; import 'package:permission_handler/permission_handler.dart';
// import 'package:qrscan/qrscan.dart' as scanner; // import 'package:qrscan/qrscan.dart' as scanner;
import 'package:barcode_scan2/barcode_scan2.dart'; import 'package:barcode_scan2/barcode_scan2.dart';
import 'package:provider/provider.dart';
class WalletsProfilesProvider with ChangeNotifier { class WalletsProfilesProvider with ChangeNotifier {
WalletsProfilesProvider(this.address); WalletsProfilesProvider(this.address);
@ -37,10 +44,7 @@ class WalletsProfilesProvider with ChangeNotifier {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
return WalletViewScreen( return WalletViewScreen(address: barcode!.rawContent);
address: barcode!.rawContent,
username: '',
);
}), }),
); );
} else { } else {
@ -125,6 +129,102 @@ class WalletsProfilesProvider with ChangeNotifier {
return _balance; return _balance;
} }
Widget headerProfileView(
BuildContext context, String address, String? username) {
const double avatarSize = 140;
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
CesiumPlusProvider cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
// SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
return Stack(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sub, _) {
bool isAccountExist = balanceCache[address] != 0;
return Container(
height: 180,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
isAccountExist ? yellowC : Colors.grey[400]!,
isAccountExist ? const Color(0xFFE7811A) : Colors.grey[600]!,
],
),
));
}),
Padding(
padding: const EdgeInsets.only(left: 30, right: 40),
child: Row(children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
height: 10,
color: yellowC, // Colors.grey[400],
),
Row(children: [
GestureDetector(
key: keyCopyAddress,
onTap: () {
Clipboard.setData(ClipboardData(text: address));
snackCopyKey(context);
},
child: Text(
getShortPubkey(address),
style: const TextStyle(
fontSize: 30,
fontWeight: FontWeight.w800,
),
),
),
]),
const SizedBox(height: 25),
balance(context, address, 22),
const SizedBox(height: 10),
walletOptions.idtyStatus(context, address,
isOwner: false, color: Colors.black),
getCerts(context, address, 14),
// if (username == null &&
// g1WalletsBox.get(address)?.username != null)
// SizedBox(
// width: 230,
// child: Text(
// g1WalletsBox.get(address)?.username ?? '',
// style: const TextStyle(
// fontSize: 27,
// color: Color(0xff814C00),
// ),
// ),
// ),
// if (username != null)
// SizedBox(
// width: 230,
// child: Text(
// username,
// style: const TextStyle(
// fontSize: 27,
// color: Color(0xff814C00),
// ),
// ),
// ),
const SizedBox(height: 55),
]),
const Spacer(),
Column(children: <Widget>[
ClipOval(
child: cesiumPlusProvider.defaultAvatar(avatarSize),
),
const SizedBox(height: 25),
]),
]),
),
CommonElements().offlineInfo(context),
]);
}
bool isContact(String address) { bool isContact(String address) {
return contactsBox.containsKey(address); return contactsBox.containsKey(address);
} }
@ -152,12 +252,3 @@ snackCopyKey(context) {
duration: const Duration(seconds: 2)); duration: const Duration(seconds: 2));
ScaffoldMessenger.of(context).showSnackBar(snackBar); ScaffoldMessenger.of(context).showSnackBar(snackBar);
} }
snackCopySeed(context) {
final snackBar = SnackBar(
padding: const EdgeInsets.all(20),
content: Text("thisMnemonicHasBeenCopiedToClipboard".tr(),
style: const TextStyle(fontSize: 17)),
duration: const Duration(seconds: 4));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}

View File

@ -1,18 +1,17 @@
// ignore_for_file: must_be_immutable // ignore_for_file: must_be_immutable
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/queries_indexer.dart'; import 'package:gecko/models/queries_indexer.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:gecko/widgets/header_profile.dart';
import 'package:gecko/widgets/page_route_no_transition.dart';
import 'package:graphql_flutter/graphql_flutter.dart'; import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -32,6 +31,12 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
WalletsProfilesProvider walletProfile =
Provider.of<WalletsProfilesProvider>(context, listen: false);
HomeProvider homeProvider =
Provider.of<HomeProvider>(context, listen: false);
return Scaffold( return Scaffold(
key: _scaffoldKey, key: _scaffoldKey,
appBar: AppBar( appBar: AppBar(
@ -42,18 +47,19 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
child: Text('accountActivity'.tr()), child: Text('accountActivity'.tr()),
), ),
), ),
bottomNavigationBar: const GeckoBottomAppBar(), bottomNavigationBar: homeProvider.bottomAppBar(context),
body: Column(children: <Widget>[ body: Column(children: <Widget>[
HeaderProfile(address: address, username: username), walletProfile.headerProfileView(context, address, username),
historyQuery(context), historyQuery(context),
])); ]));
} }
Widget historyQuery(context) { Widget historyQuery(context) {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
if (indexerEndpoint == '') { if (indexerEndpoint == '') {
return Column(children: <Widget>[ Column(children: <Widget>[
const SizedBox(height: 50), const SizedBox(height: 50),
Text( Text(
"noNetworkNoHistory".tr(), "noNetworkNoHistory".tr(),
@ -152,7 +158,8 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
} }
Widget historyView(context, result) { Widget historyView(context, result) {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
return duniterIndexer.transBC == null return duniterIndexer.transBC == null
? Column(children: <Widget>[ ? Column(children: <Widget>[
@ -186,6 +193,9 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
Widget getTransactionTile( Widget getTransactionTile(
BuildContext context, DuniterIndexer duniterIndexer) { BuildContext context, DuniterIndexer duniterIndexer) {
CesiumPlusProvider cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
int keyID = 0; int keyID = 0;
String? dateDelimiter; String? dateDelimiter;
String? lastDateDelimiter; String? lastDateDelimiter;
@ -194,8 +204,6 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
bool isTody = false; bool isTody = false;
bool isYesterday = false; bool isYesterday = false;
bool isThisWeek = false; bool isThisWeek = false;
bool isMigrationTime = false;
bool isMigrationTimePassed = false;
final Map<int, String> monthsInYear = { final Map<int, String> monthsInYear = {
1: "month1".tr(), 1: "month1".tr(),
@ -278,25 +286,7 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
finalAmount = '$amount $currencyName'; finalAmount = '$amount $currencyName';
} }
if (!isMigrationTimePassed && date.compareTo(startBlockchainTime) < 0) {
isMigrationTimePassed = true;
isMigrationTime = true;
} else {
isMigrationTime = false;
}
return Column(children: <Widget>[ return Column(children: <Widget>[
if (isMigrationTime)
const Padding(
padding: EdgeInsets.symmetric(vertical: 30),
child: Text(
'Début de la ĞDev',
style: TextStyle(
fontSize: 25,
color: Colors.blueAccent,
fontWeight: FontWeight.w500),
),
),
if (dateDelimiter != null) if (dateDelimiter != null)
Padding( Padding(
padding: const EdgeInsets.symmetric(vertical: 30), padding: const EdgeInsets.symmetric(vertical: 30),
@ -315,7 +305,7 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
contentPadding: const EdgeInsets.only( contentPadding: const EdgeInsets.only(
left: 20, right: 30, top: 15, bottom: 15), left: 20, right: 30, top: 15, bottom: 15),
leading: ClipOval( leading: ClipOval(
child: defaultAvatar(avatarSize), child: cesiumPlusProvider.defaultAvatar(avatarSize),
), ),
title: Padding( title: Padding(
padding: const EdgeInsets.only(bottom: 5), padding: const EdgeInsets.only(bottom: 5),
@ -362,11 +352,8 @@ class ActivityScreen extends StatelessWidget with ChangeNotifier {
// _cesiumPlusProvider.avatarCancelToken.cancel('cancelled'); // _cesiumPlusProvider.avatarCancelToken.cancel('cancelled');
Navigator.push( Navigator.push(
context, context,
PageNoTransit(builder: (context) { MaterialPageRoute(builder: (context) {
return WalletViewScreen( return WalletViewScreen(address: repository[1]);
address: repository[1],
username: username ?? '',
);
}), }),
); );
// Navigator.pop(context); // Navigator.pop(context);

View File

@ -1,76 +0,0 @@
import 'package:accordion/controllers.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart';
import 'package:flutter/material.dart';
import 'package:gecko/widgets/certs_received.dart';
import 'package:gecko/widgets/certs_counter.dart';
import 'package:gecko/widgets/certs_sent.dart';
import 'package:accordion/accordion.dart';
class CertificationsScreen extends StatelessWidget {
const CertificationsScreen(
{Key? key, required this.address, required this.username})
: super(key: key);
final String address;
final String username;
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: backgroundColor,
appBar: AppBar(
elevation: 0,
toolbarHeight: 60 * ratio,
title: SizedBox(
height: 22,
child: Text('Certifications de $username'),
)),
body: SafeArea(
child: Accordion(
paddingListTop: 10,
paddingListBottom: 10,
maxOpenSections: 1,
headerBackgroundColorOpened: orangeC,
scaleWhenAnimating: true,
openAndCloseAnimation: true,
headerPadding:
const EdgeInsets.symmetric(vertical: 7, horizontal: 15),
sectionOpeningHapticFeedback: SectionHapticFeedback.heavy,
sectionClosingHapticFeedback: SectionHapticFeedback.light,
children: [
AccordionSection(
isOpen: true,
leftIcon:
const Icon(Icons.insights_rounded, color: Colors.black),
headerBackgroundColor: yellowC,
headerBackgroundColorOpened: orangeC,
header: Row(children: [
Text('received'.tr()),
const SizedBox(width: 5),
CertsCounter(address: address)
]),
content: CertsReceived(address: address),
contentHorizontalPadding: 0,
contentBorderWidth: 1,
),
AccordionSection(
isOpen: false,
leftIcon:
const Icon(Icons.insights_rounded, color: Colors.black),
headerBackgroundColor: yellowC,
headerBackgroundColorOpened: orangeC,
header: Row(children: [
Text('sent'.tr()),
const SizedBox(width: 5),
CertsCounter(address: address, isSent: true)
]),
content: CertsSent(address: address),
contentHorizontalPadding: 20,
contentBorderWidth: 1,
// onOpenSection: () => print('onOpenSection ...'),
// onCloseSection: () => print('onCloseSection ...'),
),
]),
));
}
}

View File

@ -160,7 +160,7 @@ class CommonElements {
} }
Widget offlineInfo(BuildContext context) { Widget offlineInfo(BuildContext context) {
final screenWidth = MediaQuery.of(homeContext).size.width; final double screenWidth = MediaQuery.of(homeContext).size.width;
return Consumer<SubstrateSdk>(builder: (context, sub, _) { return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return Visibility( return Visibility(
visible: !sub.nodeConnected, visible: !sub.nodeConnected,
@ -279,92 +279,6 @@ Future<bool?> confirmPopup(BuildContext context, String title) async {
); );
} }
Future<bool?> confirmPopupCertification(BuildContext context, String question1,
String username, String question2, String address) async {
return showDialog<bool>(
context: context,
barrierDismissible: true,
builder: (BuildContext context) {
return AlertDialog(
// actionsPadding: const EdgeInsets.all(0.0),
backgroundColor: backgroundColor,
content: SizedBox(
height: 240,
child: Column(
children: [
const SizedBox(height: 15),
Text(
question1,
textAlign: TextAlign.center,
style:
const TextStyle(fontSize: 20, fontWeight: FontWeight.w400),
),
const SizedBox(height: 20),
Text(
username,
textAlign: TextAlign.center,
style:
const TextStyle(fontSize: 24, fontWeight: FontWeight.w500),
),
const SizedBox(height: 20),
Text(
question2,
textAlign: TextAlign.center,
style:
const TextStyle(fontSize: 20, fontWeight: FontWeight.w400),
),
const SizedBox(height: 20),
Text(
address,
textAlign: TextAlign.center,
style:
const TextStyle(fontSize: 20, fontWeight: FontWeight.w500),
),
const SizedBox(height: 20),
const Text(
'?',
textAlign: TextAlign.center,
style: TextStyle(fontSize: 20, fontWeight: FontWeight.w400),
),
],
),
),
actions: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
key: keyConfirm,
child: Text(
"yes".tr(),
style: const TextStyle(
fontSize: 25,
color: Color(0xffD80000),
),
),
onPressed: () {
Navigator.pop(context, true);
},
),
const SizedBox(width: 35),
TextButton(
child: Text(
"no".tr(),
style: const TextStyle(fontSize: 25),
),
onPressed: () {
Navigator.pop(context, false);
},
),
const SizedBox(height: 120)
],
)
],
);
},
);
}
Future<void> infoPopup(BuildContext context, String title) async { Future<void> infoPopup(BuildContext context, String title) async {
return showDialog<void>( return showDialog<void>(
context: context, context: context,
@ -402,24 +316,6 @@ Future<void> infoPopup(BuildContext context, String title) async {
); );
} }
bool isAddress(address) {
final RegExp regExp = RegExp(
r'^[a-zA-Z0-9]+$',
caseSensitive: false,
multiLine: false,
);
if (regExp.hasMatch(address) == true &&
address.length > 45 &&
address.length < 52) {
log.d("C'est une adresse !");
return true;
} else {
return false;
}
}
// Widget geckoAppBar() { // Widget geckoAppBar() {
// return AppBar( // return AppBar(
// toolbarHeight: 60 * ratio, // toolbarHeight: 60 * ratio,

View File

@ -4,8 +4,7 @@ import 'package:bubble/bubble.dart';
import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/stateful_wrapper.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
@ -15,7 +14,7 @@ import 'package:gecko/providers/wallets_profiles.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/widgets/animated_text.dart'; import 'package:gecko/screens/animated_text.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/myWallets/restore_chest.dart'; import 'package:gecko/screens/myWallets/restore_chest.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
@ -23,109 +22,22 @@ import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/screens/onBoarding/1.dart'; import 'package:gecko/screens/onBoarding/1.dart';
import 'package:gecko/screens/search.dart'; import 'package:gecko/screens/search.dart';
import 'package:gecko/screens/settings.dart'; import 'package:gecko/screens/settings.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:flutter/services.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:gecko/screens/my_contacts.dart'; import 'package:gecko/screens/my_contacts.dart';
class HomeScreen extends StatefulWidget { class HomeScreen extends StatelessWidget {
const HomeScreen({Key? key}) : super(key: key); const HomeScreen({Key? key}) : super(key: key);
@override
State<HomeScreen> createState() => _HomeScreenState();
}
class _HomeScreenState extends State<HomeScreen> {
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) async {
final homeProviderInit =
Provider.of<HomeProvider>(context, listen: false);
final sub = Provider.of<SubstrateSdk>(context, listen: false);
final duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
configBox = await Hive.openBox("configBox");
final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
if (sub.sdkReady && !sub.nodeConnected) {
// Check if versionData non compatible, drop everything
if (isWalletsExists &&
(configBox.get('dataVersion') ?? 0) < dataVersion) {
await infoPopup(context, "chestNotCompatibleMustReinstallGecko".tr());
await Hive.deleteBoxFromDisk('walletBox');
await Hive.deleteBoxFromDisk('chestBox');
chestBox = await Hive.openBox<ChestData>("chestBox");
await configBox.delete('defaultWallet');
await sub.deleteAllAccounts();
configBox.put('dataVersion', dataVersion);
myWalletProvider.reload();
}
walletBox = await Hive.openBox<WalletData>("walletBox");
await Hive.deleteBoxFromDisk('g1WalletsBox');
g1WalletsBox = await Hive.openBox<G1WalletsList>("g1WalletsBox");
contactsBox = await Hive.openBox<G1WalletsList>("contactsBox");
homeProviderInit.isWalletBoxInit = true;
myWalletProvider.reload();
duniterIndexer.getValidIndexerEndpoint();
await homeProviderInit.getValidEndpoints();
// await configBox.delete('isCacheChecked');
if (configBox.get('isCacheChecked') == null) {
configBox.put('isCacheChecked', false);
}
// log.d(await configBox.get('endpoint'));
// var connectivityResult =
// await (Connectivity().checkConnectivity());
// if (connectivityResult != ConnectivityResult.mobile &&
// connectivityResult != ConnectivityResult.wifi) {
// homeProvider.changeMessage(
// "notConnectedToInternet".tr(), 0);
// sub.nodeConnected = false;
// }
// TODO: fix random bad network status on startup
HomeProvider homeProvider =
Provider.of<HomeProvider>(context, listen: false);
Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) async {
log.d('Network changed: $result');
if (result == ConnectivityResult.none) {
sub.nodeConnected = false;
await sub.sdk.api.setting.unsubscribeBestNumber();
homeProvider.changeMessage("notConnectedToInternet".tr(), 0);
sub.reload();
} else {
await sub.connectNode(context);
// Currency parameters
sub.initCurrencyParameters();
}
// Indexer Blockchain start
getBlockStart();
});
// await sub.connectNode(ctx);
}
// _duniterIndexer.checkIndexerEndpointBackground();
});
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
homeContext = context; homeContext = context;
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final myWalletProvider = Provider.of<MyWalletsProvider>(context); MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context);
Provider.of<ChestProvider>(context); Provider.of<ChestProvider>(context);
SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
isTall = false; isTall = false;
@ -186,19 +98,97 @@ class _HomeScreenState extends State<HomeScreen> {
], ],
), ),
), ),
// bottomNavigationBar: _homeProvider.bottomBar(context, 1),
backgroundColor: const Color(0xffF9F9F1), backgroundColor: const Color(0xffF9F9F1),
body: isWalletsExists ? geckHome(context) : welcomeHome(context)); body: Builder(
builder: (ctx) => StatefulWrapper(
onInit: () {
WidgetsBinding.instance.addPostFrameCallback((_) async {
DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(ctx, listen: false);
duniterIndexer.getValidIndexerEndpoint();
if (!sub.sdkReady && !sub.sdkLoading) await sub.initApi();
if (sub.sdkReady && !sub.nodeConnected) {
// Check if versionData non compatible, drop everything
if (walletBox.isNotEmpty &&
walletBox.getAt(0)!.version! < dataVersion) {
await infoPopup(
context, "chestNotCompatibleMustReinstallGecko".tr());
await walletBox.clear();
await chestBox.clear();
await configBox.delete('defaultWallet');
await sub.deleteAllAccounts();
myWalletProvider.reload();
}
// var connectivityResult =
// await (Connectivity().checkConnectivity());
// if (connectivityResult != ConnectivityResult.mobile &&
// connectivityResult != ConnectivityResult.wifi) {
// homeProvider.changeMessage(
// "notConnectedToInternet".tr(), 0);
// sub.nodeConnected = false;
// }
// TODO: fix random bad network status on startup
HomeProvider homeProvider =
Provider.of<HomeProvider>(ctx, listen: false);
Connectivity()
.onConnectivityChanged
.listen((ConnectivityResult result) async {
log.d('Network changed: $result');
if (result == ConnectivityResult.none) {
sub.nodeConnected = false;
await sub.sdk.api.setting.unsubscribeBestNumber();
homeProvider.changeMessage(
"notConnectedToInternet".tr(), 0);
sub.reload();
} else {
await sub.connectNode(ctx);
}
});
// await sub.connectNode(ctx);
}
// _duniterIndexer.checkIndexerEndpointBackground();
});
},
child: isWalletsExists ? geckHome(context) : welcomeHome(context)
// bottomNavigationBar: BottomNavigationBar(
// backgroundColor: backgroundColor,
// fixedColor: Colors.grey[850],
// unselectedItemColor: const Color(0xffBD935C),
// type: BottomNavigationBarType.fixed,
// onTap: (index) {
// _homeProvider.currentIndex = index;
// },
// currentIndex: _homeProvider.currentIndex,
// items: [
// BottomNavigationBarItem(
// icon: Image.asset('assets/block-space-disabled.png', height: 26),
// activeIcon: Image.asset('assets/blockchain.png', height: 26),
// label: 'Explorateur',
// ),
// const BottomNavigationBarItem(
// icon: Icon(Icons.lock),
// label: 'Mes portefeuilles',
// ),
// ],
// ),
),
),
);
} }
} }
Widget geckHome(context) { Widget geckHome(context) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); MyWalletsProvider myWalletProvider = Provider.of<MyWalletsProvider>(context);
final homeProvider = Provider.of<HomeProvider>(context, listen: false);
Provider.of<ChestProvider>(context); Provider.of<ChestProvider>(context);
WalletsProfilesProvider historyProvider = WalletsProfilesProvider historyProvider =
Provider.of<WalletsProfilesProvider>(context); Provider.of<WalletsProfilesProvider>(context);
final statusBarHeight = MediaQuery.of(context).padding.top; final double statusBarHeight = MediaQuery.of(context).padding.top;
return Container( return Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(
image: DecorationImage( image: DecorationImage(
@ -340,13 +330,15 @@ Widget geckHome(context) {
child: ClipOval( child: ClipOval(
key: keyOpenWalletsHomme, key: keyOpenWalletsHomme,
child: Material( child: Material(
color: homeProvider.isWalletBoxInit color: orangeC, // button color
? orangeC
: Colors.grey[500], // button color
child: InkWell( child: InkWell(
onTap: !homeProvider.isWalletBoxInit child: Padding(
? null padding: const EdgeInsets.all(18),
: () async { child: Image(
image: const AssetImage(
'assets/home/wallet.png'),
height: 68 * ratio)),
onTap: () async {
WalletData? defaultWallet = WalletData? defaultWallet =
myWalletProvider.getDefaultWallet(); myWalletProvider.getDefaultWallet();
String? pin; String? pin;
@ -361,8 +353,7 @@ Widget geckHome(context) {
), ),
); );
} }
if (pin != null || if (pin != null || myWalletProvider.pinCode != '') {
myWalletProvider.pinCode != '') {
Navigator.push( Navigator.push(
context, context,
MaterialPageRoute(builder: (context) { MaterialPageRoute(builder: (context) {
@ -374,13 +365,7 @@ Widget geckHome(context) {
// Navigator.pushNamed( // Navigator.pushNamed(
// context, '/mywallets'))); // context, '/mywallets')));
}, }),
child: Padding(
padding: const EdgeInsets.all(18),
child: Image(
image: const AssetImage(
'assets/home/wallet.png'),
height: 68 * ratio))),
), ),
), ),
), ),
@ -449,7 +434,7 @@ Widget geckHome(context) {
} }
Widget welcomeHome(context) { Widget welcomeHome(context) {
final statusBarHeight = MediaQuery.of(context).padding.top; final double statusBarHeight = MediaQuery.of(context).padding.top;
return Container( return Container(
decoration: const BoxDecoration( decoration: const BoxDecoration(

View File

@ -3,7 +3,7 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:durt/durt.dart'; import 'package:durt/durt.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/stateful_wrapper.dart'; import 'package:gecko/models/stateful_wrapper.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
@ -26,8 +26,9 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final myWalletProvider = SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
return WillPopScope( return WillPopScope(
@ -117,7 +118,7 @@ class ChangePinScreen extends StatelessWidget with ChangeNotifier {
); );
} }
if (pin != null || myWalletProvider.pinCode != '') { if (pin != null || myWalletProvider.pinCode != '') {
await sub.changePassword(context, defaultWallet.address, await sub.changePassword(context, defaultWallet.address!,
walletProvider.pinCode, newPin.text); walletProvider.pinCode, newPin.text);
walletProvider.pinCode = newPin.text; walletProvider.pinCode = newPin.text;
newPin.text = ''; newPin.text = '';

View File

@ -4,10 +4,11 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_data.dart';
import 'package:flutter/services.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/chest_provider.dart'; import 'package:gecko/providers/chest_provider.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -15,7 +16,6 @@ import 'package:gecko/screens/myWallets/change_pin.dart';
import 'package:gecko/screens/myWallets/custom_derivations.dart'; import 'package:gecko/screens/myWallets/custom_derivations.dart';
import 'package:gecko/screens/myWallets/show_seed.dart'; import 'package:gecko/screens/myWallets/show_seed.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class ChestOptions extends StatelessWidget { class ChestOptions extends StatelessWidget {
@ -25,7 +25,11 @@ class ChestOptions extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final chestProvider = Provider.of<ChestProvider>(context, listen: false); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
ChestProvider chestProvider =
Provider.of<ChestProvider>(context, listen: false);
HomeProvider homeProvider =
Provider.of<HomeProvider>(context, listen: false);
ChestData currentChest = chestBox.get(configBox.get('currentChest'))!; ChestData currentChest = chestBox.get(configBox.get('currentChest'))!;
@ -48,7 +52,7 @@ class ChestOptions extends StatelessWidget {
height: 22, height: 22,
child: Text(currentChest.name!), child: Text(currentChest.name!),
)), )),
bottomNavigationBar: const GeckoBottomAppBar(), bottomNavigationBar: homeProvider.bottomAppBar(context),
body: Stack(children: [ body: Stack(children: [
Builder( Builder(
builder: (ctx) => SafeArea( builder: (ctx) => SafeArea(
@ -57,7 +61,7 @@ class ChestOptions extends StatelessWidget {
InkWell( InkWell(
key: keyShowSeed, key: keyShowSeed,
onTap: () async { onTap: () async {
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
WalletData? defaultWallet = WalletData? defaultWallet =
myWalletProvider.getDefaultWallet(); myWalletProvider.getDefaultWallet();

View File

@ -1,7 +1,7 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
@ -30,7 +30,9 @@ class _ChooseChestState extends State<ChooseChest> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context);
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,

View File

@ -3,15 +3,15 @@
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart'; import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// import 'package:gecko/models/home.dart'; // import 'package:gecko/models/home.dart';
// import 'package:provider/provider.dart'; // import 'package:provider/provider.dart';
@ -23,7 +23,8 @@ class ChooseWalletScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final int chest = configBox.get('currentChest'); final int chest = configBox.get('currentChest');
return Scaffold( return Scaffold(
@ -72,7 +73,9 @@ class ChooseWalletScreen extends StatelessWidget {
} }
Widget myWalletsTiles(BuildContext context, int currentChest) { Widget myWalletsTiles(BuildContext context, int currentChest) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context);
// SubstrateSdk _sub = Provider.of<SubstrateSdk>(context, listen: false);
final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
@ -94,11 +97,8 @@ class ChooseWalletScreen extends StatelessWidget {
]); ]);
} }
List<WalletData> listWallets = myWalletProvider.listWallets; List listWallets = myWalletProvider.listWallets;
listWallets.sort((p1, p2) { final double screenWidth = MediaQuery.of(context).size.width;
return Comparable.compare(p1.number!, p2.number!);
});
final screenWidth = MediaQuery.of(context).size.width;
int nTule = 2; int nTule = 2;
if (screenWidth >= 900) { if (screenWidth >= 900) {
@ -116,11 +116,11 @@ class ChooseWalletScreen extends StatelessWidget {
crossAxisSpacing: 0, crossAxisSpacing: 0,
mainAxisSpacing: 0, mainAxisSpacing: 0,
children: <Widget>[ children: <Widget>[
for (WalletData repository in listWallets) for (WalletData repository in listWallets as Iterable<WalletData>)
Padding( Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: GestureDetector( child: GestureDetector(
key: keySelectThisWallet(repository.address), key: keySelectThisWallet(repository.address!),
onTap: () { onTap: () {
selectedWallet = repository; selectedWallet = repository;
myWalletProvider.reload(); myWalletProvider.reload();
@ -169,8 +169,8 @@ class ChooseWalletScreen extends StatelessWidget {
), ),
), ),
)), )),
balanceBuilder(context, repository.address, balanceBuilder(context, repository.address!,
selectedWallet!.address == repository.address), selectedWallet!.address == repository.address!),
ListTile( ListTile(
shape: const RoundedRectangleBorder( shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical( borderRadius: BorderRadius.vertical(
@ -225,10 +225,8 @@ class ChooseWalletScreen extends StatelessWidget {
// style: TextStyle(color: isDefault ? Colors.white : Colors.black), // style: TextStyle(color: isDefault ? Colors.white : Colors.black),
// ), // ),
Row(mainAxisAlignment: MainAxisAlignment.center, children: [ Row(mainAxisAlignment: MainAxisAlignment.center, children: [
Balance( balance(
address: address, context, address, 16, isDefault ? Colors.white : Colors.black),
size: 16,
color: isDefault ? Colors.white : Colors.black),
]) ])
]), ]),
), ),

View File

@ -1,7 +1,7 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
@ -27,7 +27,8 @@ class _CustomDerivationState extends State<CustomDerivation> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final myWalletProvider = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final derivationList = <String>[ final derivationList = <String>[

View File

@ -4,18 +4,16 @@ import 'dart:async';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/certifications.dart';
import 'package:gecko/widgets/idty_status.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class ImportG1v1 extends StatelessWidget { class ImportG1v1 extends StatelessWidget {
@ -23,7 +21,10 @@ class ImportG1v1 extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final myWalletProvider = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
Timer? debounce; Timer? debounce;
@ -56,7 +57,7 @@ class ImportG1v1 extends StatelessWidget {
child: Consumer<SubstrateSdk>(builder: (context, sub, _) { child: Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder( return FutureBuilder(
future: sub.getBalanceAndIdtyStatus( future: sub.getBalanceAndIdtyStatus(
sub.g1V1NewAddress, selectedWallet.address), sub.g1V1NewAddress, selectedWallet.address!),
builder: (BuildContext context, AsyncSnapshot<List> status) { builder: (BuildContext context, AsyncSnapshot<List> status) {
// log.d(_certs.data); // log.d(_certs.data);
@ -82,7 +83,6 @@ class ImportG1v1 extends StatelessWidget {
final String idtyStatus = status.data?[1]; final String idtyStatus = status.data?[1];
final String myIdtyStatus = status.data?[2]; final String myIdtyStatus = status.data?[2];
final bool hasConsumer = status.data?[3] ?? false; final bool hasConsumer = status.data?[3] ?? false;
final bool isSmith = status.data?[4] ?? false;
// log.d('hasconsumer: $hasConsumer'); // log.d('hasconsumer: $hasConsumer');
@ -92,7 +92,7 @@ class ImportG1v1 extends StatelessWidget {
} else { } else {
canValidate = false; canValidate = false;
validationStatus = hasConsumer validationStatus = hasConsumer
? 'youMustWaitBeforeCashoutThisAccount'.tr() ? 'youMustWaitBeforeCashoutThisAccount'.tr(args: ['X'])
: 'thisAccountIsEmpty'.tr(); : 'thisAccountIsEmpty'.tr();
} }
@ -102,11 +102,6 @@ class ImportG1v1 extends StatelessWidget {
'youCannotMigrateIdentityToExistingIdentity'.tr(); 'youCannotMigrateIdentityToExistingIdentity'.tr();
} }
if (isSmith) {
canValidate = false;
validationStatus = 'smithCantMigrateIdentity'.tr();
}
if (sub.g1V1NewAddress == '') { if (sub.g1V1NewAddress == '') {
validationStatus = ''; validationStatus = '';
} }
@ -190,13 +185,13 @@ class ImportG1v1 extends StatelessWidget {
key: keyCopyAddress, key: keyCopyAddress,
onTap: () { onTap: () {
Clipboard.setData( Clipboard.setData(
ClipboardData(text: sub.g1V1OldPubkey)); ClipboardData(text: sub.g1V1NewAddress));
snackCopyKey(context); snackCopyKey(context);
}, },
child: Text( child: Text(
sub.g1V1OldPubkey, getShortPubkey(sub.g1V1NewAddress),
style: const TextStyle( style: const TextStyle(
fontSize: 16, fontSize: 20,
fontWeight: FontWeight.w600, fontWeight: FontWeight.w600,
), ),
), ),
@ -209,12 +204,10 @@ class ImportG1v1 extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
IdentityStatus( walletOptions.idtyStatus(context, sub.g1V1NewAddress,
address: sub.g1V1NewAddress, isOwner: false, color: Colors.black),
isOwner: false,
color: Colors.black),
const SizedBox(width: 10), const SizedBox(width: 10),
Certifications(address: sub.g1V1NewAddress, size: 14) getCerts(context, sub.g1V1NewAddress, 14)
], ],
), ),
const SizedBox(height: 30), const SizedBox(height: 30),
@ -228,7 +221,7 @@ class ImportG1v1 extends StatelessWidget {
icon: const Icon(Icons.keyboard_arrow_down), icon: const Icon(Icons.keyboard_arrow_down),
items: myWalletProvider.listWallets.map((wallet) { items: myWalletProvider.listWallets.map((wallet) {
return DropdownMenuItem( return DropdownMenuItem(
key: keySelectThisWallet(wallet.address), key: keySelectThisWallet(wallet.address!),
value: wallet, value: wallet,
child: Text( child: Text(
wallet.name!, wallet.name!,
@ -270,8 +263,10 @@ class ImportG1v1 extends StatelessWidget {
); );
} }
sub.migrateCsToV2(sub.csSalt.text, sub.migrateCsToV2(
sub.csPassword.text, selectedWallet.address, sub.csSalt.text,
sub.csPassword.text,
selectedWallet.address!,
destPassword: destPassword:
pin ?? myWalletProvider.pinCode, pin ?? myWalletProvider.pinCode,
balance: balance, balance: balance,
@ -284,7 +279,7 @@ class ImportG1v1 extends StatelessWidget {
fromAddress: fromAddress:
getShortPubkey(sub.g1V1NewAddress), getShortPubkey(sub.g1V1NewAddress),
toAddress: getShortPubkey( toAddress: getShortPubkey(
selectedWallet.address)); selectedWallet.address!));
}), }),
); );
resetScreen(context); resetScreen(context);
@ -313,7 +308,7 @@ class ImportG1v1 extends StatelessWidget {
} }
void resetScreen(BuildContext context) { void resetScreen(BuildContext context) {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
sub.csSalt.text = ''; sub.csSalt.text = '';
sub.csPassword.text = ''; sub.csPassword.text = '';

View File

@ -1,7 +1,7 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
@ -27,6 +27,7 @@ class ManageMembership extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final sub = Provider.of<SubstrateSdk>(context); final sub = Provider.of<SubstrateSdk>(context);
return Scaffold( return Scaffold(
@ -115,9 +116,9 @@ class ManageMembership extends StatelessWidget {
false; false;
if (answer) { if (answer) {
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
// MyWalletsProvider mw = MyWalletsProvider(); // MyWalletsProvider mw = MyWalletsProvider();
// final wallet = mw.getWalletDataByAddress(address); // final wallet = mw.getWalletDataByAddress(address);

View File

@ -1,7 +1,7 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -20,12 +20,14 @@ class MigrateIdentityScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// final _homeProvider = Provider.of<HomeProvider>(context); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final walletOptions = // HomeProvider _homeProvider = Provider.of<HomeProvider>(context);
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false); Provider.of<WalletOptionsProvider>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
final fromAddress = walletOptions.address.text; final fromAddress = walletOptions.address.text;
final defaultWallet = myWalletProvider.getDefaultWallet(); final defaultWallet = myWalletProvider.getDefaultWallet();
@ -75,7 +77,7 @@ class MigrateIdentityScreen extends StatelessWidget {
child: Consumer<SubstrateSdk>(builder: (context, sub, _) { child: Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder( return FutureBuilder(
future: sub.getBalanceAndIdtyStatus( future: sub.getBalanceAndIdtyStatus(
fromAddress, selectedWallet.address), fromAddress, selectedWallet.address!),
builder: (BuildContext context, AsyncSnapshot<List> status) { builder: (BuildContext context, AsyncSnapshot<List> status) {
if (status.data == null) { if (status.data == null) {
return Column(children: [ return Column(children: [
@ -101,21 +103,12 @@ class MigrateIdentityScreen extends StatelessWidget {
final String idtyStatus = status.data?[1]; final String idtyStatus = status.data?[1];
final String myIdtyStatus = status.data?[2]; final String myIdtyStatus = status.data?[2];
final bool hasConsumer = status.data?[3] ?? false; final bool hasConsumer = status.data?[3] ?? false;
final bool isSmith = status.data?[4] ?? false;
// log.d('hasconsumer: $hasConsumer'); // log.d('hasconsumer: $hasConsumer');
if (isSmith) { if (balance['transferableBalance'] != 0 && !hasConsumer) {
canValidate = false;
validationStatus = 'smithCantMigrateIdentity'.tr();
} else if (balance['transferableBalance'] != 0 &&
!hasConsumer) {
canValidate = true; canValidate = true;
validationStatus = ''; validationStatus = '';
} else if (idtyStatus != 'noid' && myIdtyStatus != 'noid') {
canValidate = false;
validationStatus =
'youCannotMigrateIdentityToExistingIdentity'.tr();
} else { } else {
canValidate = false; canValidate = false;
validationStatus = hasConsumer validationStatus = hasConsumer
@ -123,8 +116,14 @@ class MigrateIdentityScreen extends StatelessWidget {
: 'thisAccountIsEmpty'.tr(); : 'thisAccountIsEmpty'.tr();
} }
if (idtyStatus != 'noid' && myIdtyStatus != 'noid') {
canValidate = false;
validationStatus =
'youCannotMigrateIdentityToExistingIdentity'.tr();
}
log.d( log.d(
'tatatata: ${sub.g1V1NewAddress}, ${selectedWallet.address}, $balance, $idtyStatus, $myIdtyStatus'); 'tatatata: ${sub.g1V1NewAddress}, ${selectedWallet.address!}, $balance, $idtyStatus, $myIdtyStatus');
final walletsList = myWalletProvider.listWallets.toList(); final walletsList = myWalletProvider.listWallets.toList();
@ -177,7 +176,7 @@ class MigrateIdentityScreen extends StatelessWidget {
icon: const Icon(Icons.keyboard_arrow_down), icon: const Icon(Icons.keyboard_arrow_down),
items: walletsList.map((wallet) { items: walletsList.map((wallet) {
return DropdownMenuItem( return DropdownMenuItem(
key: keySelectThisWallet(wallet.address), key: keySelectThisWallet(wallet.address!),
value: wallet, value: wallet,
child: Text( child: Text(
wallet.name!, wallet.name!,
@ -222,7 +221,7 @@ class MigrateIdentityScreen extends StatelessWidget {
sub.migrateIdentity( sub.migrateIdentity(
fromAddress: fromAddress, fromAddress: fromAddress,
destAddress: selectedWallet.address, destAddress: selectedWallet.address!,
fromPassword: pin ?? myWalletProvider.pinCode, fromPassword: pin ?? myWalletProvider.pinCode,
destPassword: pin ?? myWalletProvider.pinCode, destPassword: pin ?? myWalletProvider.pinCode,
withBalance: true, withBalance: true,
@ -234,7 +233,7 @@ class MigrateIdentityScreen extends StatelessWidget {
transType: 'identityMigration', transType: 'identityMigration',
fromAddress: getShortPubkey(fromAddress), fromAddress: getShortPubkey(fromAddress),
toAddress: getShortPubkey( toAddress: getShortPubkey(
selectedWallet.address)); selectedWallet.address!));
}), }),
); );
} }

View File

@ -1,6 +1,6 @@
import 'package:bubble/bubble.dart'; import 'package:bubble/bubble.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
@ -19,8 +19,10 @@ class RestoreChest extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final genW = Provider.of<GenerateWalletsProvider>(context, listen: false); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final sub = Provider.of<SubstrateSdk>(context, listen: false); GenerateWalletsProvider genW =
Provider.of<GenerateWalletsProvider>(context, listen: false);
SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
genW.actualWallet = null; genW.actualWallet = null;
if (genW.isSentenceComplete(context)) { if (genW.isSentenceComplete(context)) {
@ -181,7 +183,7 @@ class RestoreChest extends StatelessWidget {
} }
Widget arrayCell(BuildContext context, TextEditingController cellCtl) { Widget arrayCell(BuildContext context, TextEditingController cellCtl) {
final generateWalletProvider = GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context); Provider.of<GenerateWalletsProvider>(context);
return Container( return Container(

View File

@ -1,13 +1,11 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:pdf/pdf.dart'; import 'package:pdf/pdf.dart';
import 'package:printing/printing.dart'; import 'package:printing/printing.dart';
@ -25,11 +23,12 @@ class ShowSeed extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final myWalletProvider = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
WalletData defaultWallet = myWalletProvider.getDefaultWallet(); WalletData defaultWallet = myWalletProvider.getDefaultWallet();
@ -46,7 +45,7 @@ class ShowSeed extends StatelessWidget {
const Spacer(flex: 1), const Spacer(flex: 1),
FutureBuilder( FutureBuilder(
future: future:
sub.getSeed(defaultWallet.address, walletProvider.pinCode), sub.getSeed(defaultWallet.address!, walletProvider.pinCode),
builder: (BuildContext context, AsyncSnapshot<String?> seed) { builder: (BuildContext context, AsyncSnapshot<String?> seed) {
if (seed.connectionState != ConnectionState.done || if (seed.connectionState != ConnectionState.done ||
seed.hasError) { seed.hasError) {
@ -84,7 +83,7 @@ class ShowSeed extends StatelessWidget {
onPressed: () { onPressed: () {
Clipboard.setData( Clipboard.setData(
ClipboardData(text: seed.data)); ClipboardData(text: seed.data));
snackCopySeed(context); snackCopyKey(context);
}, },
child: Row(children: <Widget>[ child: Row(children: <Widget>[
Image.asset( Image.asset(
@ -142,6 +141,16 @@ class ShowSeed extends StatelessWidget {
)); ));
} }
snackCopyKey(context) {
const snackBar = SnackBar(
padding: EdgeInsets.all(20),
content: Text(
"Votre phrase de restauration a été copié dans votre presse-papier.",
style: TextStyle(fontSize: 16)),
duration: Duration(seconds: 2));
ScaffoldMessenger.of(context).showSnackBar(snackBar);
}
Widget sentanceArray(BuildContext context, List mnemonic) { Widget sentanceArray(BuildContext context, List mnemonic) {
return Padding( return Padding(
padding: const EdgeInsets.symmetric(horizontal: 3), padding: const EdgeInsets.symmetric(horizontal: 3),

View File

@ -3,7 +3,7 @@
import 'dart:async'; import 'dart:async';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
@ -22,8 +22,6 @@ class UnlockingWallet extends StatelessWidget {
late int currentChestNumber; late int currentChestNumber;
late ChestData currentChest; late ChestData currentChest;
bool canUnlock = true; bool canUnlock = true;
TextEditingController enterPin = TextEditingController();
FocusNode pinFocus = FocusNode(debugLabel: 'pinFocusNode');
// ignore: close_sinks // ignore: close_sinks
StreamController<ErrorAnimationType>? errorController; StreamController<ErrorAnimationType>? errorController;
@ -32,10 +30,10 @@ class UnlockingWallet extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final walletOptions = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
Provider.of<WalletOptionsProvider>(context, listen: false); WalletOptionsProvider walletOptions =
final myWalletProvider = Provider.of<WalletOptionsProvider>(context);
Provider.of<MyWalletsProvider>(context, listen: false); // final double statusBarHeight = MediaQuery.of(context).padding.top;
currentChestNumber = configBox.get('currentChest'); currentChestNumber = configBox.get('currentChest');
currentChest = chestBox.get(currentChestNumber)!; currentChest = chestBox.get(currentChestNumber)!;
@ -43,15 +41,7 @@ class UnlockingWallet extends StatelessWidget {
int pinLenght = walletOptions.getPinLenght(wallet.number); int pinLenght = walletOptions.getPinLenght(wallet.number);
errorController = StreamController<ErrorAnimationType>(); errorController = StreamController<ErrorAnimationType>();
// if (enterPin.text == '') myWalletProvider.isPinLoading = true; return Scaffold(
return WillPopScope(
onWillPop: () {
myWalletProvider.isPinValid = false;
myWalletProvider.isPinLoading = true;
return Future<bool>.value(true);
},
child: Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
body: SafeArea( body: SafeArea(
child: Column( child: Column(
@ -69,11 +59,7 @@ class UnlockingWallet extends StatelessWidget {
color: Colors.black, color: Colors.black,
size: 30, size: 30,
), ),
onPressed: () { onPressed: () => Navigator.pop(context),
myWalletProvider.isPinValid = false;
myWalletProvider.isPinLoading = true;
Navigator.pop(context);
},
), ),
), ),
), ),
@ -113,21 +99,11 @@ class UnlockingWallet extends StatelessWidget {
color: Colors.black, color: Colors.black,
fontWeight: FontWeight.w400), fontWeight: FontWeight.w400),
)), )),
SizedBox(height: 30 * ratio), SizedBox(height: 40 * ratio),
if (!myWalletProvider.isPinValid &&
!myWalletProvider.isPinLoading)
Text(
"Ce n'est pas le bon code".tr(),
style: const TextStyle(
color: Colors.red, fontWeight: FontWeight.w500),
),
SizedBox(height: 10 * ratio),
pinForm(context, pinLenght), pinForm(context, pinLenght),
SizedBox(height: 3 * ratio), SizedBox(height: 3 * ratio),
if (canUnlock) if (canUnlock)
Consumer<WalletOptionsProvider>( InkWell(
builder: (context, sub, _) {
return InkWell(
key: keyCachePassword, key: keyCachePassword,
onTap: () { onTap: () {
walletOptions.changePinCacheChoice(); walletOptions.changePinCacheChoice();
@ -149,8 +125,7 @@ class UnlockingWallet extends StatelessWidget {
), ),
const Spacer() const Spacer()
]), ]),
); ),
}),
const SizedBox(height: 10), const SizedBox(height: 10),
// if (canUnlock) // if (canUnlock)
InkWell( InkWell(
@ -179,32 +154,41 @@ class UnlockingWallet extends StatelessWidget {
]), ]),
]), ]),
]), ]),
)), ));
);
} }
Widget pinForm(context, pinLenght) { Widget pinForm(context, pinLenght) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); // var _walletPin = '';
final sub = Provider.of<SubstrateSdk>(context, listen: false); // ignore: close_sinks
StreamController<ErrorAnimationType> errorController =
StreamController<ErrorAnimationType>();
TextEditingController enterPin = TextEditingController();
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context);
SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
FocusNode pinFocus = FocusNode();
WalletData defaultWallet = myWalletProvider.getDefaultWallet(); WalletData defaultWallet = myWalletProvider.getDefaultWallet();
// if (defaultWallet.address == null) { // defaultWallet.address = null;
// canUnlock = false; if (defaultWallet.address == null) {
// return Text( canUnlock = false;
// 'Impossible de retrouver votre\nportefeuille par défaut.\nID: ${defaultWallet.id()}', return Text(
// textAlign: TextAlign.center, 'Impossible de retrouver votre\nportefeuille par défaut.\nID: ${defaultWallet.id()}',
// style: const TextStyle( textAlign: TextAlign.center,
// color: Colors.redAccent, fontWeight: FontWeight.w500), style: const TextStyle(
// ); color: Colors.redAccent, fontWeight: FontWeight.w500),
// } );
}
return Form( return Form(
// key: keyPinForm,
child: Padding( child: Padding(
padding: EdgeInsets.symmetric(vertical: 5 * ratio, horizontal: 30), padding: EdgeInsets.symmetric(vertical: 5 * ratio, horizontal: 30),
child: PinCodeTextField( child: PinCodeTextField(
key: keyPinForm, key: keyPinForm,
textCapitalization: TextCapitalization.characters,
focusNode: pinFocus, focusNode: pinFocus,
autoFocus: true, autoFocus: true,
appContext: context, appContext: context,
@ -215,8 +199,7 @@ class UnlockingWallet extends StatelessWidget {
length: pinLenght, length: pinLenght,
obscureText: true, obscureText: true,
obscuringCharacter: '*', obscuringCharacter: '*',
animationType: AnimationType.slide, animationType: AnimationType.fade,
animationDuration: const Duration(milliseconds: 40),
validator: (v) { validator: (v) {
if (v!.length < pinLenght) { if (v!.length < pinLenght) {
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]); return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
@ -235,9 +218,11 @@ class UnlockingWallet extends StatelessWidget {
), ),
showCursor: kDebugMode ? false : true, showCursor: kDebugMode ? false : true,
cursorColor: Colors.black, cursorColor: Colors.black,
textStyle: const TextStyle(fontSize: 27, height: 1.6), animationDuration: const Duration(milliseconds: 300),
textStyle: const TextStyle(fontSize: 20, height: 1.6),
backgroundColor: const Color(0xffF9F9F1), backgroundColor: const Color(0xffF9F9F1),
enableActiveFill: false, enableActiveFill: false,
errorAnimationController: errorController,
controller: enterPin, controller: enterPin,
keyboardType: TextInputType.visiblePassword, keyboardType: TextInputType.visiblePassword,
boxShadows: const [ boxShadows: const [
@ -248,32 +233,28 @@ class UnlockingWallet extends StatelessWidget {
) )
], ],
onCompleted: (pin) async { onCompleted: (pin) async {
myWalletProvider.isPinLoading = true;
myWalletProvider.pinCode = pin.toUpperCase(); myWalletProvider.pinCode = pin.toUpperCase();
final isValid = await sub.checkPassword( final isValid = await sub.checkPassword(
defaultWallet.address, pin.toUpperCase()); defaultWallet.address!, pin.toUpperCase());
if (!isValid) { if (!isValid) {
await Future.delayed(const Duration(milliseconds: 20)); await Future.delayed(const Duration(milliseconds: 50));
errorController.add(ErrorAnimationType
.shake); // Triggering error shake animation
pinColor = Colors.red[600]; pinColor = Colors.red[600];
myWalletProvider.isPinLoading = false;
myWalletProvider.isPinValid = false;
myWalletProvider.pinCode = myWalletProvider.mnemonic = ''; myWalletProvider.pinCode = myWalletProvider.mnemonic = '';
enterPin.text = ''; walletOptions.reload();
pinFocus.requestFocus(); pinFocus.requestFocus();
} else { } else {
myWalletProvider.isPinValid = true;
myWalletProvider.isPinLoading = false;
pinColor = Colors.green[400]; pinColor = Colors.green[400];
myWalletProvider.resetPinCode(); myWalletProvider.resetPinCode();
Navigator.pop(context, pin.toUpperCase()); Navigator.pop(context, pin.toUpperCase());
} }
}, },
onChanged: (value) { onChanged: (value) {
if (enterPin.text != '') myWalletProvider.isPinLoading = true;
if (pinColor != const Color(0xFFA4B600)) { if (pinColor != const Color(0xFFA4B600)) {
pinColor = const Color(0xFFA4B600); pinColor = const Color(0xFFA4B600);
} }
myWalletProvider.reload();
}, },
)), )),
); );

View File

@ -2,28 +2,21 @@ import 'dart:async';
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart'; import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/certifications.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/activity.dart'; import 'package:gecko/screens/activity.dart';
import 'package:gecko/screens/myWallets/manage_membership.dart'; import 'package:gecko/screens/myWallets/manage_membership.dart';
import 'package:gecko/screens/qrcode_fullscreen.dart'; import 'package:gecko/screens/qrcode_fullscreen.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:gecko/widgets/certifications.dart';
import 'package:gecko/widgets/idty_status.dart';
import 'package:gecko/widgets/name_by_address.dart';
import 'package:gecko/widgets/page_route_no_transition.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter/services.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
class WalletOptions extends StatelessWidget { class WalletOptions extends StatelessWidget {
@ -33,24 +26,25 @@ class WalletOptions extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final walletOptions = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false); Provider.of<WalletOptionsProvider>(context, listen: false);
WalletsProfilesProvider historyProvider = WalletsProfilesProvider historyProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false); Provider.of<WalletsProfilesProvider>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); HomeProvider homeProvider =
final sub = Provider.of<SubstrateSdk>(context, listen: false); Provider.of<HomeProvider>(context, listen: false);
DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
// final sub = Provider.of<SubstrateSdk>(context, listen: false); // SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
// sub.spawnBlock(); // sub.spawnBlock();
// sub.spawnBlock(0, 20); // sub.spawnBlock(0, 20);
log.d(walletOptions.address.text); log.d(walletOptions.address.text);
final currentChest = myWalletProvider.getCurrentChest(); final int currentChest = myWalletProvider.getCurrentChest();
bool isWalletNameIndexed =
duniterIndexer.walletNameIndexer[walletOptions.address.text] != null;
// final currentWallet = _myWalletProvider.getDefaultWallet(); // final currentWallet = _myWalletProvider.getDefaultWallet();
// log.d(_walletOptions.getAddress(_currentChest, 3)); // log.d(_walletOptions.getAddress(_currentChest, 3));
@ -82,10 +76,7 @@ class WalletOptions extends StatelessWidget {
height: 22, height: 22,
child: Consumer<WalletOptionsProvider>( child: Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) { builder: (context, walletProvider, _) {
return Text(isWalletNameIndexed return Text(wallet.name!);
? duniterIndexer
.walletNameIndexer[walletOptions.address.text]!
: wallet.name!);
}), }),
), ),
actions: [ actions: [
@ -108,7 +99,7 @@ class WalletOptions extends StatelessWidget {
), ),
], ],
), ),
bottomNavigationBar: const GeckoBottomAppBar(), bottomNavigationBar: homeProvider.bottomAppBar(context),
body: Stack(children: [ body: Stack(children: [
Builder( Builder(
builder: (ctx) => SafeArea( builder: (ctx) => SafeArea(
@ -129,91 +120,40 @@ class WalletOptions extends StatelessWidget {
backgroundColor, backgroundColor,
], ],
)), )),
child: Row(children: <Widget>[ child: Row(
// mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
const Spacer(flex: 1), const Spacer(flex: 1),
avatar(walletProvider), avatar(walletProvider),
const Spacer(flex: 1), const Spacer(flex: 1),
Column( Column(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[ children: <Widget>[
Stack(children: [ duniterIndexer.getNameByAddress(
SizedBox(
width: 250,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Consumer<WalletOptionsProvider>(
builder: (context, walletProvider, _) {
return NameByAddress(
wallet: wallet,
size: 27,
color: Colors.black,
fontWeight: wallet.isMember
? FontWeight.w500
: FontWeight.w400,
fontStyle: FontStyle.normal);
})
],
),
),
const SizedBox(width: 10),
if (duniterIndexer
.walletNameIndexer[wallet.address] ==
null)
Positioned(
right: 0,
child: InkWell(
key: keyRenameWallet,
onTap: () async {
await walletOptions.editWalletName(
context, wallet.id());
await Future.delayed(
const Duration(milliseconds: 30));
},
child: ClipRRect(
child: Image.asset(
walletOptions.isEditing
? 'assets/walletOptions/android-checkmark.png'
: 'assets/walletOptions/edit.png',
width: 25,
height: 25),
),
),
),
]),
SizedBox(height: isTall ? 5 : 0),
Balance(
address: walletProvider.address.text, size: 21),
const SizedBox(width: 30),
InkWell(
onTap: () => isWalletNameIndexed
? {
Navigator.push(
context, context,
PageNoTransit(builder: (context) {
return CertificationsScreen(
address:
walletProvider.address.text, walletProvider.address.text,
username: duniterIndexer wallet,
.walletNameIndexer[ 27,
walletProvider false,
.address.text]!); Colors.black,
}), FontWeight.w400,
), FontStyle.normal),
} // SizedBox(height: isTall ? 5 : 0),
: null,
child: Column( SizedBox(height: isTall ? 5 : 0),
crossAxisAlignment: CrossAxisAlignment.center, balance(
context, walletProvider.address.text, 21),
const SizedBox(width: 30),
Column(
crossAxisAlignment:
CrossAxisAlignment.center,
children: [ children: [
IdentityStatus( walletOptions.idtyStatus(
address: walletOptions.address.text, context, walletOptions.address.text,
isOwner: true, isOwner: true, color: orangeC),
color: orangeC), getCerts(context,
Certifications( walletProvider.address.text, 15),
address: walletProvider.address.text,
size: 15)
]), ]),
),
SizedBox(height: 10 * ratio), SizedBox(height: 10 * ratio),
]), ]),
const Spacer(flex: 2), const Spacer(flex: 2),
@ -261,8 +201,8 @@ class WalletOptions extends StatelessWidget {
SizedBox(height: 17 * ratio), SizedBox(height: 17 * ratio),
// walletProvider.isMember(context, _walletOptions.address.text) // walletProvider.isMember(context, _walletOptions.address.text)
FutureBuilder( FutureBuilder(
future: future: walletProvider.isMember(
sub.isMember(walletOptions.address.text), context, walletOptions.address.text),
builder: (BuildContext context, builder: (BuildContext context,
AsyncSnapshot<bool> isMember) { AsyncSnapshot<bool> isMember) {
if (isMember.connectionState != if (isMember.connectionState !=
@ -362,7 +302,7 @@ class WalletOptions extends StatelessWidget {
foregroundColor: Colors.white, elevation: 4, foregroundColor: Colors.white, elevation: 4,
backgroundColor: orangeC, // foreground backgroundColor: orangeC, // foreground
), ),
onPressed: () async { onPressed: () {
walletProvider.confirmIdentityPopup(context); walletProvider.confirmIdentityPopup(context);
// Navigator.push( // Navigator.push(
// context, // context,
@ -397,7 +337,7 @@ class WalletOptions extends StatelessWidget {
} }
Widget pubkeyWidget(WalletOptionsProvider walletProvider, BuildContext ctx) { Widget pubkeyWidget(WalletOptionsProvider walletProvider, BuildContext ctx) {
final shortPubkey = getShortPubkey(walletProvider.address.text); final String shortPubkey = getShortPubkey(walletProvider.address.text);
return GestureDetector( return GestureDetector(
key: keyCopyAddress, key: keyCopyAddress,
onTap: () { onTap: () {
@ -464,7 +404,7 @@ class WalletOptions extends StatelessWidget {
// _historyProvider.nPage = 1; // _historyProvider.nPage = 1;
Navigator.push( Navigator.push(
context, context,
PageNoTransit(builder: (context) { MaterialPageRoute(builder: (context) {
return ActivityScreen( return ActivityScreen(
address: walletProvider.address.text, address: walletProvider.address.text,
avatar: wallet.imageCustomPath == null avatar: wallet.imageCustomPath == null
@ -497,7 +437,7 @@ class WalletOptions extends StatelessWidget {
} }
Widget manageMembership(BuildContext context) { Widget manageMembership(BuildContext context) {
final walletOptions = WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false); Provider.of<WalletOptionsProvider>(context, listen: false);
return InkWell( return InkWell(
key: keyManageMembership, key: keyManageMembership,
@ -529,8 +469,8 @@ class WalletOptions extends StatelessWidget {
Widget setDefaultWalletWidget( Widget setDefaultWalletWidget(
BuildContext context, BuildContext context,
WalletOptionsProvider walletProvider, WalletOptionsProvider walletProvider,
final myWalletProvider, MyWalletsProvider myWalletProvider,
final walletOptions, WalletOptionsProvider walletOptions,
int currentChest) { int currentChest) {
return Consumer<MyWalletsProvider>(builder: (context, myWalletProvider, _) { return Consumer<MyWalletsProvider>(builder: (context, myWalletProvider, _) {
WalletData defaultWallet = myWalletProvider.getDefaultWallet(); WalletData defaultWallet = myWalletProvider.getDefaultWallet();
@ -571,10 +511,10 @@ class WalletOptions extends StatelessWidget {
} }
Future setDefaultWallet(BuildContext context, int currentChest) async { Future setDefaultWallet(BuildContext context, int currentChest) async {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final walletOptions = WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false); Provider.of<WalletOptionsProvider>(context, listen: false);
// WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!; // WalletData defaultWallet = _myWalletProvider.getDefaultWallet()!;
@ -585,26 +525,26 @@ class WalletOptions extends StatelessWidget {
walletOptions.reload(); walletOptions.reload();
} }
Widget deleteWallet(BuildContext context, WalletOptionsProvider walletOptions, Widget deleteWallet(BuildContext context,
int currentChest) { WalletOptionsProvider walletProvider, int currentChest) {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final defaultWallet = myWalletProvider.getDefaultWallet(); final defaultWallet = myWalletProvider.getDefaultWallet();
final bool isDefaultWallet = final bool isDefaultWallet =
walletOptions.address.text == defaultWallet.address; walletProvider.address.text == defaultWallet.address;
// return Consumer<MyWalletsProvider>( // return Consumer<MyWalletsProvider>(
// builder: (context, _myWalletProvider, _) { // builder: (context, _myWalletProvider, _) {
return FutureBuilder( return FutureBuilder(
future: sub.hasAccountConsumers(wallet.address), future: sub.hasAccountConsumers(wallet.address!),
builder: (BuildContext context, AsyncSnapshot<bool> hasConsumers) { builder: (BuildContext context, AsyncSnapshot<bool> hasConsumers) {
if (hasConsumers.connectionState != ConnectionState.done || if (hasConsumers.connectionState != ConnectionState.done ||
hasConsumers.hasError) { hasConsumers.hasError) {
return const Text(''); return const Text('');
} }
final double balance = final double balance =
walletOptions.balanceCache[walletOptions.address.text] ?? -1; balanceCache[walletProvider.address.text] ?? -1;
final bool canDelete = !isDefaultWallet && final bool canDelete = !isDefaultWallet &&
!hasConsumers.data! && !hasConsumers.data! &&
(balance > 2 || balance == 0); (balance > 2 || balance == 0);
@ -612,7 +552,7 @@ class WalletOptions extends StatelessWidget {
key: keyDeleteWallet, key: keyDeleteWallet,
onTap: canDelete onTap: canDelete
? () async { ? () async {
await walletOptions.deleteWallet(context, wallet); await walletProvider.deleteWallet(context, wallet);
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
myWalletProvider.listWallets = myWalletProvider.listWallets =
myWalletProvider.readAllWallets(currentChest); myWalletProvider.readAllWallets(currentChest);

View File

@ -1,12 +1,15 @@
// ignore_for_file: use_build_context_synchronously // ignore_for_file: use_build_context_synchronously
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/chest_data.dart'; import 'package:gecko/models/chest_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -19,20 +22,20 @@ import 'package:gecko/screens/myWallets/import_g1_v1.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallet_options.dart'; import 'package:gecko/screens/myWallets/wallet_options.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:truncate/truncate.dart';
class WalletsHome extends StatelessWidget { class WalletsHome extends StatelessWidget {
const WalletsHome({Key? key}) : super(key: key); const WalletsHome({Key? key}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context);
HomeProvider homeProvider =
Provider.of<HomeProvider>(context, listen: false);
final currentChestNumber = myWalletProvider.getCurrentChest(); final int currentChestNumber = myWalletProvider.getCurrentChest();
final ChestData currentChest = chestBox.get(currentChestNumber)!; final ChestData currentChest = chestBox.get(currentChestNumber)!;
myWalletProvider.listWallets = myWalletProvider.listWallets =
myWalletProvider.readAllWallets(currentChestNumber); myWalletProvider.readAllWallets(currentChestNumber);
@ -63,9 +66,7 @@ class WalletsHome extends StatelessWidget {
backgroundColor: const Color(0xffFFD58D), backgroundColor: const Color(0xffFFD58D),
), ),
bottomNavigationBar: myWalletProvider.lastFlyBy == '' bottomNavigationBar: myWalletProvider.lastFlyBy == ''
? const GeckoBottomAppBar( ? homeProvider.bottomAppBar(context)
actualRoute: 'safeHome',
)
: dragInfo(context), : dragInfo(context),
body: SafeArea( body: SafeArea(
child: Stack(children: [ child: Stack(children: [
@ -89,7 +90,7 @@ class WalletsHome extends StatelessWidget {
final bool isSameAddress = final bool isSameAddress =
myWalletProvider.dragAddress == myWalletProvider.lastFlyBy; myWalletProvider.dragAddress == myWalletProvider.lastFlyBy;
final screenWidth = MediaQuery.of(homeContext).size.width; final double screenWidth = MediaQuery.of(homeContext).size.width;
return Container( return Container(
color: yellowC, color: yellowC,
width: screenWidth, width: screenWidth,
@ -108,7 +109,8 @@ class WalletsHome extends StatelessWidget {
); );
} }
Widget chestOptions(BuildContext context, final myWalletProvider) { Widget chestOptions(
BuildContext context, MyWalletsProvider myWalletProvider) {
return Column(children: [ return Column(children: [
const SizedBox(height: 50), const SizedBox(height: 50),
SizedBox( SizedBox(
@ -139,15 +141,6 @@ class WalletsHome extends StatelessWidget {
), ),
)), )),
const SizedBox(height: 30), const SizedBox(height: 30),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
SvgPicture.asset(
'assets/cesium_bw2.svg',
semanticsLabel: 'CS',
height: 50,
),
const SizedBox(width: 5),
InkWell( InkWell(
key: keyImportG1v1, key: keyImportG1v1,
onTap: () { onTap: () {
@ -159,7 +152,7 @@ class WalletsHome extends StatelessWidget {
); );
}, },
child: SizedBox( child: SizedBox(
width: 350, width: 400,
height: 60, height: 60,
child: Center( child: Center(
child: Text('importG1v1'.tr(), child: Text('importG1v1'.tr(),
@ -169,9 +162,7 @@ class WalletsHome extends StatelessWidget {
fontWeight: FontWeight.w500))), fontWeight: FontWeight.w500))),
), ),
), ),
], const SizedBox(height: 5),
),
const SizedBox(height: 20),
InkWell( InkWell(
key: keyChangeChest, key: keyChangeChest,
onTap: () { onTap: () {
@ -198,12 +189,12 @@ class WalletsHome extends StatelessWidget {
} }
Widget myWalletsTiles(BuildContext context, int currentChestNumber) { Widget myWalletsTiles(BuildContext context, int currentChestNumber) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); MyWalletsProvider myWalletProvider =
final walletOptions = Provider.of<MyWalletsProvider>(context);
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false); Provider.of<WalletOptionsProvider>(context, listen: false);
final bool isWalletsExists = myWalletProvider.checkIfWalletExist(); final bool isWalletsExists = myWalletProvider.checkIfWalletExist();
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
if (!isWalletsExists) { if (!isWalletsExists) {
return const Text(''); return const Text('');
@ -220,14 +211,9 @@ class WalletsHome extends StatelessWidget {
])); ]));
} }
// Get wallet list and sort by derivation number List listWallets = myWalletProvider.listWallets;
List<WalletData> listWallets = myWalletProvider.listWallets;
listWallets.sort((p1, p2) {
return Comparable.compare(p1.number!, p2.number!);
});
WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
final screenWidth = MediaQuery.of(context).size.width; final double screenWidth = MediaQuery.of(context).size.width;
int nTule = 2; int nTule = 2;
if (screenWidth >= 900) { if (screenWidth >= 900) {
@ -249,17 +235,17 @@ class WalletsHome extends StatelessWidget {
crossAxisSpacing: 0, crossAxisSpacing: 0,
mainAxisSpacing: 0, mainAxisSpacing: 0,
children: <Widget>[ children: <Widget>[
for (WalletData repository in listWallets) for (WalletData repository in listWallets as Iterable<WalletData>)
LongPressDraggable<String>( LongPressDraggable<String>(
delay: const Duration(milliseconds: 200), delay: const Duration(milliseconds: 200),
data: repository.address, data: repository.address!,
dragAnchorStrategy: dragAnchorStrategy:
(Draggable<Object> _, BuildContext __, Offset ___) => (Draggable<Object> _, BuildContext __, Offset ___) =>
const Offset(0, 0), const Offset(0, 0),
// feedbackOffset: const Offset(-500, -500), // feedbackOffset: const Offset(-500, -500),
// dragAnchorStrategy: childDragAnchorStrategy, // dragAnchorStrategy: childDragAnchorStrategy,
onDragStarted: () => onDragStarted: () =>
myWalletProvider.dragAddress = repository.address, myWalletProvider.dragAddress = repository.address!,
onDragEnd: (_) { onDragEnd: (_) {
myWalletProvider.lastFlyBy = ''; myWalletProvider.lastFlyBy = '';
myWalletProvider.dragAddress = ''; myWalletProvider.dragAddress = '';
@ -280,21 +266,21 @@ class WalletsHome extends StatelessWidget {
child: DragTarget<String>( child: DragTarget<String>(
onAccept: (senderAddress) async { onAccept: (senderAddress) async {
log.d( log.d(
'INTERPAY: sender: $senderAddress --- receiver: ${repository.address}'); 'INTERPAY: sender: $senderAddress --- receiver: ${repository.address!}');
final walletData = myWalletProvider final walletData = myWalletProvider
.getWalletDataByAddress(senderAddress); .getWalletDataByAddress(senderAddress);
await sub.setCurrentWallet(walletData!); await sub.setCurrentWallet(walletData!);
sub.reload(); sub.reload();
paymentPopup(context, repository.address); paymentPopup(context, repository.address!);
}, },
onMove: (details) { onMove: (details) {
if (repository.address != myWalletProvider.lastFlyBy) { if (repository.address! != myWalletProvider.lastFlyBy) {
myWalletProvider.lastFlyBy = repository.address; myWalletProvider.lastFlyBy = repository.address!;
myWalletProvider.reload(); myWalletProvider.reload();
} }
}, },
onWillAccept: (senderAddress) => onWillAccept: (senderAddress) =>
senderAddress != repository.address, senderAddress != repository.address!,
builder: ( builder: (
BuildContext context, BuildContext context,
List<dynamic> accepted, List<dynamic> accepted,
@ -303,7 +289,7 @@ class WalletsHome extends StatelessWidget {
return Padding( return Padding(
padding: const EdgeInsets.all(16), padding: const EdgeInsets.all(16),
child: GestureDetector( child: GestureDetector(
key: keyOpenWallet(repository.address), key: keyOpenWallet(repository.address!),
onTap: () { onTap: () {
walletOptions.getAddress( walletOptions.getAddress(
currentChestNumber, repository.derivation!); currentChestNumber, repository.derivation!);
@ -331,15 +317,14 @@ class WalletsHome extends StatelessWidget {
child: Container( child: Container(
width: double.infinity, width: double.infinity,
height: double.infinity, height: double.infinity,
decoration: const BoxDecoration( decoration: BoxDecoration(
gradient: RadialGradient( gradient: RadialGradient(
radius: 0.8, radius: 0.6,
colors: [ colors: [
Color.fromARGB(255, 255, 255, 211), Colors.green[400]!,
yellowC, const Color(0xFFE7E7A6),
], ],
), )),
),
child: child:
// SvgPicture.asset('assets/chopp-gecko2.png', // SvgPicture.asset('assets/chopp-gecko2.png',
// semanticsLabel: 'Gecko', height: 48), // semanticsLabel: 'Gecko', height: 48),
@ -367,45 +352,11 @@ class WalletsHome extends StatelessWidget {
Stack(children: <Widget>[ Stack(children: <Widget>[
balanceBuilder( balanceBuilder(
context, context,
repository.address, repository.address!,
repository.address == repository.address ==
defaultWallet.address), defaultWallet.address),
Row( nameBuilder(context, repository,
mainAxisAlignment: MainAxisAlignment.center, defaultWallet, currentChestNumber),
children: [
Column(
children: [
const SizedBox(height: 7),
Opacity(
opacity: 0.7,
child: Text(
duniterIndexer.walletNameIndexer[
repository.address] ??
truncate(
repository.name!, 20),
style: TextStyle(
fontSize: 20,
color:
defaultWallet.address ==
repository.address
? Colors.white
: Colors.black,
fontWeight: FontWeight.w500),
),
)
// NameByAddress(
// wallet: repository,
// address: repository.address,
// size: 20,
// color: defaultWallet.address ==
// repository.address
// ? Colors.white
// : Colors.black,
// ),
],
),
],
),
]), ]),
]), ]),
), ),
@ -429,26 +380,64 @@ class WalletsHome extends StatelessWidget {
width: double.infinity, width: double.infinity,
color: isDefault ? orangeC : yellowC, color: isDefault ? orangeC : yellowC,
child: Padding( child: Padding(
padding: padding: const EdgeInsets.only(left: 5, right: 5, top: 38),
const EdgeInsets.only(left: 5, right: 5, top: 38, bottom: 10),
child: Row( child: Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Opacity( balance(
opacity: 0.7, context,
child: Balance( address,
address: address, 15,
size: 16, isDefault ? Colors.white : Colors.black,
color: isDefault ? Colors.white : Colors.black, isDefault ? yellowC : orangeC)
loadingColor: isDefault ? yellowC : orangeC),
)
], ],
)), )),
); );
} }
Widget nameBuilder(BuildContext context, WalletData repository,
WalletData defaultWallet, int currentChestNumber) {
WalletOptionsProvider walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
return ListTile(
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.vertical(bottom: Radius.circular(12))),
tileColor: repository.address == defaultWallet.address
? orangeC
: const Color(0xffFFD58D),
title: Center(
child: Padding(
padding: const EdgeInsets.only(left: 5, right: 5, bottom: 35, top: 5),
child: duniterIndexer.getNameByAddress(
context,
repository.address!,
repository,
20,
true,
repository.id()[1] == defaultWallet.id()[1]
? const Color(0xffF9F9F1)
: Colors.black),
),
),
onTap: () {
walletOptions.getAddress(currentChestNumber, repository.derivation!);
Navigator.push(
context,
SmoothTransition(
page: WalletOptions(
wallet: repository,
),
),
);
},
);
}
Widget addNewDerivation(context) { Widget addNewDerivation(context) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context);
String newDerivationName = String newDerivationName =
'${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}'; '${'wallet'.tr()} ${myWalletProvider.listWallets.last.number! + 2}';

View File

@ -1,19 +1,17 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:gecko/widgets/name_by_address.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class ContactsScreen extends StatelessWidget { class ContactsScreen extends StatelessWidget {
@ -21,9 +19,15 @@ class ContactsScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CesiumPlusProvider cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
WalletsProfilesProvider walletsProfilesClass = WalletsProfilesProvider walletsProfilesClass =
Provider.of<WalletsProfilesProvider>(context, listen: true); Provider.of<WalletsProfilesProvider>(context, listen: true);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); HomeProvider homeProvider =
Provider.of<HomeProvider>(context, listen: false);
DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
double avatarSize = 55; double avatarSize = 55;
@ -49,7 +53,7 @@ class ContactsScreen extends StatelessWidget {
'contactsManagementWithNbr'.tr(args: ['${myContacts.length}'])), 'contactsManagementWithNbr'.tr(args: ['${myContacts.length}'])),
), ),
), ),
bottomNavigationBar: const GeckoBottomAppBar(), bottomNavigationBar: homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: Stack(children: [ child: Stack(children: [
Padding( Padding(
@ -70,7 +74,8 @@ class ContactsScreen extends StatelessWidget {
key: keySearchResult('keyID++'), key: keySearchResult('keyID++'),
horizontalTitleGap: 40, horizontalTitleGap: 40,
contentPadding: const EdgeInsets.all(5), contentPadding: const EdgeInsets.all(5),
leading: defaultAvatar(avatarSize), leading: cesiumPlusProvider
.defaultAvatar(avatarSize),
title: Row(children: <Widget>[ title: Row(children: <Widget>[
Text(getShortPubkey(g1Wallet.address), Text(getShortPubkey(g1Wallet.address),
style: const TextStyle( style: const TextStyle(
@ -92,18 +97,15 @@ class ContactsScreen extends StatelessWidget {
mainAxisAlignment: mainAxisAlignment:
MainAxisAlignment.center, MainAxisAlignment.center,
children: [ children: [
Balance( balance(context,
address: g1Wallet.address, 16),
g1Wallet.address,
size: 16),
]), ]),
]), ]),
), ),
]), ]),
subtitle: Row(children: <Widget>[ subtitle: Row(children: <Widget>[
NameByAddress( duniterIndexer.getNameByAddress(
wallet: context, g1Wallet.address)
WalletData(address: g1Wallet.address))
]), ]),
dense: false, dense: false,
isThreeLine: false, isThreeLine: false,
@ -115,10 +117,10 @@ class ContactsScreen extends StatelessWidget {
g1Wallet.address; g1Wallet.address;
return WalletViewScreen( return WalletViewScreen(
address: g1Wallet.address, address: g1Wallet.address,
username: username: g1WalletsBox
duniterIndexer.walletNameIndexer[ .get(g1Wallet.address)
g1Wallet.address] ?? ?.id
'', ?.username,
avatar: g1WalletsBox avatar: g1WalletsBox
.get(g1Wallet.address) .get(g1Wallet.address)
?.avatar, ?.avatar,

View File

@ -1,6 +1,6 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -11,6 +11,7 @@ class OnboardingStepOne extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,

View File

@ -4,7 +4,7 @@
import 'dart:async'; import 'dart:async';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
@ -26,27 +26,18 @@ class OnboardingStepTen extends StatelessWidget {
final formKey = GlobalKey<FormState>(); final formKey = GlobalKey<FormState>();
Color? pinColor = const Color(0xFFA4B600); Color? pinColor = const Color(0xFFA4B600);
bool hasError = false; bool hasError = false;
TextEditingController enterPin = TextEditingController();
FocusNode pinFocus = FocusNode(debugLabel: 'pinFocusNode');
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final generateWalletProvider = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context); Provider.of<GenerateWalletsProvider>(context);
final walletOptions = Provider.of<WalletOptionsProvider>(context); WalletOptionsProvider walletOptions =
final sub = Provider.of<SubstrateSdk>(context); Provider.of<WalletOptionsProvider>(context);
final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
final pinLenght = generateWalletProvider.pin.text.length; final int pinLenght = generateWalletProvider.pin.text.length;
return WillPopScope( return Scaffold(
onWillPop: () {
myWalletProvider.isPinValid = false;
myWalletProvider.isPinLoading = true;
return Future<bool>.value(true);
},
child: Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
appBar: AppBar( appBar: AppBar(
toolbarHeight: 60 * ratio, toolbarHeight: 60 * ratio,
@ -57,13 +48,6 @@ class OnboardingStepTen extends StatelessWidget {
style: const TextStyle(fontWeight: FontWeight.w600), style: const TextStyle(fontWeight: FontWeight.w600),
), ),
), ),
leading: IconButton(
icon: const Icon(Icons.arrow_back, color: Colors.black),
onPressed: () {
myWalletProvider.isPinValid = false;
myWalletProvider.isPinLoading = true;
Navigator.of(context).pop();
}),
), ),
extendBodyBehindAppBar: true, extendBodyBehindAppBar: true,
body: SafeArea( body: SafeArea(
@ -73,7 +57,7 @@ class OnboardingStepTen extends StatelessWidget {
common.buildProgressBar(9), common.buildProgressBar(9),
SizedBox(height: isTall ? 40 : 20), SizedBox(height: isTall ? 40 : 20),
common.buildText("geckoWillCheckPassword".tr()), common.buildText("geckoWillCheckPassword".tr()),
SizedBox(height: isTall ? 60 : 10), SizedBox(height: isTall ? 80 : 20),
Visibility( Visibility(
visible: generateWalletProvider.scanedValidWalletNumber != -1, visible: generateWalletProvider.scanedValidWalletNumber != -1,
child: Padding( child: Padding(
@ -98,18 +82,6 @@ class OnboardingStepTen extends StatelessWidget {
), ),
), ),
), ),
Consumer<MyWalletsProvider>(builder: (context, mw, _) {
return Visibility(
visible: !myWalletProvider.isPinValid &&
!myWalletProvider.isPinLoading,
child: Text(
"Ce n'est pas le bon code".tr(),
style: const TextStyle(
color: Colors.red, fontWeight: FontWeight.w500),
),
);
}),
SizedBox(height: isTall ? 20 : 10),
Consumer<SubstrateSdk>(builder: (context, sub, _) { Consumer<SubstrateSdk>(builder: (context, sub, _) {
return sub.nodeConnected return sub.nodeConnected
? pinForm(context, walletOptions, pinLenght, 1, 2) ? pinForm(context, walletOptions, pinLenght, 1, 2)
@ -127,8 +99,7 @@ class OnboardingStepTen extends StatelessWidget {
), ),
]); ]);
}), }),
Consumer<WalletOptionsProvider>( Consumer<SubstrateSdk>(builder: (context, sub, _) {
builder: (context, walletOptions, _) {
return sub.nodeConnected return sub.nodeConnected
? InkWell( ? InkWell(
key: keyCachePassword, key: keyCachePassword,
@ -158,18 +129,23 @@ class OnboardingStepTen extends StatelessWidget {
]), ]),
CommonElements().offlineInfo(context), CommonElements().offlineInfo(context),
]), ]),
)), ));
);
} }
Widget pinForm( Widget pinForm(context, WalletOptionsProvider walletOptions, pinLenght,
context, final walletOptions, pinLenght, int walletNbr, int derivation) { int walletNbr, int derivation) {
final myWalletProvider = Provider.of<MyWalletsProvider>(context); // var _walletPin = '';
final generateWalletProvider = // ignore: close_sinks
StreamController<ErrorAnimationType> errorController =
StreamController<ErrorAnimationType>();
TextEditingController enterPin = TextEditingController();
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context);
GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context); Provider.of<GenerateWalletsProvider>(context);
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final currentChest = myWalletProvider.getCurrentChest(); final int currentChest = myWalletProvider.getCurrentChest();
return Form( return Form(
key: formKey, key: formKey,
@ -177,9 +153,6 @@ class OnboardingStepTen extends StatelessWidget {
padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 30), padding: const EdgeInsets.symmetric(vertical: 8.0, horizontal: 30),
child: PinCodeTextField( child: PinCodeTextField(
key: keyPinForm, key: keyPinForm,
textCapitalization: TextCapitalization.characters,
// autoDisposeControllers: false,
focusNode: pinFocus,
autoFocus: true, autoFocus: true,
appContext: context, appContext: context,
pastedTextStyle: TextStyle( pastedTextStyle: TextStyle(
@ -189,8 +162,7 @@ class OnboardingStepTen extends StatelessWidget {
length: pinLenght, length: pinLenght,
obscureText: true, obscureText: true,
obscuringCharacter: '*', obscuringCharacter: '*',
animationType: AnimationType.slide, animationType: AnimationType.fade,
animationDuration: const Duration(milliseconds: 40),
validator: (v) { validator: (v) {
if (v!.length < pinLenght) { if (v!.length < pinLenght) {
return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]); return "yourPasswordLengthIsX".tr(args: [pinLenght.toString()]);
@ -203,15 +175,17 @@ class OnboardingStepTen extends StatelessWidget {
borderWidth: 4, borderWidth: 4,
shape: PinCodeFieldShape.box, shape: PinCodeFieldShape.box,
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
fieldHeight: 50 * ratio, fieldHeight: 60,
fieldWidth: 50, fieldWidth: 50,
activeFillColor: Colors.black, activeFillColor: hasError ? Colors.blueAccent : Colors.black,
), ),
showCursor: kDebugMode ? false : true, showCursor: kDebugMode ? false : true,
cursorColor: Colors.black, cursorColor: Colors.black,
textStyle: const TextStyle(fontSize: 27, height: 1.6), animationDuration: const Duration(milliseconds: 300),
textStyle: const TextStyle(fontSize: 20, height: 1.6),
backgroundColor: const Color(0xffF9F9F1), backgroundColor: const Color(0xffF9F9F1),
enableActiveFill: false, enableActiveFill: false,
errorAnimationController: errorController,
controller: enterPin, controller: enterPin,
keyboardType: TextInputType.visiblePassword, keyboardType: TextInputType.visiblePassword,
boxShadows: const [ boxShadows: const [
@ -227,8 +201,6 @@ class OnboardingStepTen extends StatelessWidget {
log.d('$pin || ${generateWalletProvider.pin.text}'); log.d('$pin || ${generateWalletProvider.pin.text}');
if (pin.toUpperCase() == generateWalletProvider.pin.text) { if (pin.toUpperCase() == generateWalletProvider.pin.text) {
pinColor = Colors.green[500]; pinColor = Colors.green[500];
myWalletProvider.isPinLoading = false;
myWalletProvider.isPinValid = true;
await generateWalletProvider.storeHDWChest(context); await generateWalletProvider.storeHDWChest(context);
bool isAlive = false; bool isAlive = false;
@ -242,14 +214,14 @@ class OnboardingStepTen extends StatelessWidget {
derivePath: '//2', derivePath: '//2',
password: generateWalletProvider.pin.text); password: generateWalletProvider.pin.text);
WalletData myWallet = WalletData( WalletData myWallet = WalletData(
version: dataVersion,
chest: configBox.get('currentChest'), chest: configBox.get('currentChest'),
address: address, address: address,
number: 0, number: 0,
name: 'currentWallet'.tr(), name: 'currentWallet'.tr(),
derivation: 2, derivation: 2,
imageDefaultPath: '0.png', imageDefaultPath: '0.png');
isOwned: true); await walletBox.add(myWallet);
await walletBox.put(myWallet.address, myWallet);
} }
myWalletProvider.readAllWallets(currentChest); myWalletProvider.readAllWallets(currentChest);
myWalletProvider.reload(); myWalletProvider.reload();
@ -263,21 +235,17 @@ class OnboardingStepTen extends StatelessWidget {
page: const OnboardingStepEleven(), isFast: false), page: const OnboardingStepEleven(), isFast: false),
); );
} else { } else {
errorController.add(ErrorAnimationType
.shake); // Triggering error shake animation
hasError = true; hasError = true;
myWalletProvider.isPinLoading = false;
myWalletProvider.isPinValid = false;
pinColor = Colors.red[600]; pinColor = Colors.red[600];
enterPin.text = ''; walletOptions.reload();
// myWalletProvider.reload();
pinFocus.requestFocus();
} }
}, },
onChanged: (value) { onChanged: (value) {
if (enterPin.text != '') myWalletProvider.isPinLoading = true;
if (pinColor != const Color(0xFFA4B600)) { if (pinColor != const Color(0xFFA4B600)) {
pinColor = const Color(0xFFA4B600); pinColor = const Color(0xFFA4B600);
} }
myWalletProvider.reload();
}, },
)), )),
); );

View File

@ -1,7 +1,7 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
@ -12,6 +12,7 @@ class OnboardingStepEleven extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
return Scaffold( return Scaffold(
@ -58,8 +59,22 @@ Widget finishButton(BuildContext context) {
backgroundColor: orangeC, // foreground backgroundColor: orangeC, // foreground
), ),
onPressed: () { onPressed: () {
//TODO: fix bad widget ancestor when pupUntil (multi_chest test failed)
// Navigator.popUntil(homeContext, ModalRoute.withName('/'));
// Navigator.of(homeContext, rootNavigator: true)
// .popUntil(ModalRoute.withName('/'));
// while (Navigator.of(homeContext).canPop()) {
// Navigator.of(homeContext).pop();
// }
// Navigator.pushNamed(homeContext, '/mywallets');
Navigator.pushNamedAndRemoveUntil( Navigator.pushNamedAndRemoveUntil(
context, '/mywallets', ModalRoute.withName('/')); context, '/mywallets', (route) => route.isFirst);
// Navigator.pushNamedAndRemoveUntil(
// homeContext, '/mywallets', ModalRoute.withName('/'));
}, },
child: Text("accessMyChest".tr(), child: Text("accessMyChest".tr(),
style: style:

View File

@ -1,7 +1,7 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -12,6 +12,7 @@ class OnboardingStepTwo extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
return Scaffold( return Scaffold(

View File

@ -1,7 +1,7 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -12,6 +12,7 @@ class OnboardingStepThree extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
return Scaffold( return Scaffold(

View File

@ -1,7 +1,7 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -12,6 +12,7 @@ class OnboardingStepFor extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
return Scaffold( return Scaffold(

View File

@ -1,14 +1,12 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/generate_wallets.dart'; import 'package:gecko/providers/generate_wallets.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/onBoarding/6.dart'; import 'package:gecko/screens/onBoarding/6.dart';
import 'package:printing/printing.dart'; import 'package:printing/printing.dart';
@ -31,7 +29,8 @@ class OnboardingStepFive extends StatefulWidget {
class _ChooseChestState extends State<OnboardingStepFive> { class _ChooseChestState extends State<OnboardingStepFive> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final generateWalletProvider = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false); Provider.of<GenerateWalletsProvider>(context, listen: false);
final CommonElements common = CommonElements(); final CommonElements common = CommonElements();
@ -59,10 +58,6 @@ class _ChooseChestState extends State<OnboardingStepFive> {
SizedBox(height: 35 * ratio), SizedBox(height: 35 * ratio),
sentanceArray(context), sentanceArray(context),
SizedBox(height: 17 * ratio), SizedBox(height: 17 * ratio),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
// const SizedBox(height: 10),
GestureDetector( GestureDetector(
onTap: () { onTap: () {
Navigator.push( Navigator.push(
@ -78,39 +73,6 @@ class _ChooseChestState extends State<OnboardingStepFive> {
height: 42 * ratio, height: 42 * ratio,
), ),
), ),
SizedBox(
height: 40,
width: 120,
child: ElevatedButton(
style: ElevatedButton.styleFrom(
foregroundColor: Colors.black,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
backgroundColor: orangeC,
elevation: 1, // foreground
),
onPressed: () {
Clipboard.setData(ClipboardData(
text: generateWalletProvider.generatedMnemonic));
snackCopySeed(context);
},
child: Row(children: <Widget>[
Image.asset(
'assets/walletOptions/copy-white.png',
height: 25,
),
const SizedBox(width: 7),
Text(
'copy'.tr(),
style: TextStyle(fontSize: 15, color: Colors.grey[50]),
)
]),
),
),
],
),
const SizedBox(height: 40), const SizedBox(height: 40),
Expanded( Expanded(
child: Align( child: Align(
@ -150,7 +112,7 @@ class _ChooseChestState extends State<OnboardingStepFive> {
} }
Widget sentanceArray(BuildContext context) { Widget sentanceArray(BuildContext context) {
final generateWalletProvider = GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false); Provider.of<GenerateWalletsProvider>(context, listen: false);
return Padding( return Padding(
@ -227,7 +189,7 @@ class PrintWallet extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final generateWalletProvider = GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false); Provider.of<GenerateWalletsProvider>(context, listen: false);
return MaterialApp( return MaterialApp(
home: Scaffold( home: Scaffold(
@ -260,9 +222,9 @@ class PrintWallet extends StatelessWidget {
Widget nextButton( Widget nextButton(
BuildContext context, String text, bool isFast, bool skipIntro) { BuildContext context, String text, bool isFast, bool skipIntro) {
final generateWalletProvider = GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false); Provider.of<GenerateWalletsProvider>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
return SizedBox( return SizedBox(
width: 380 * ratio, width: 380 * ratio,

View File

@ -2,7 +2,7 @@
// ignore_for_file: must_be_immutable // ignore_for_file: must_be_immutable
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
@ -24,7 +24,8 @@ class OnboardingStepSix extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final generateWalletProvider = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: true); Provider.of<GenerateWalletsProvider>(context, listen: true);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
@ -144,7 +145,7 @@ class OnboardingStepSix extends StatelessWidget {
} }
Widget nextButton(BuildContext context, String text, nextScreen, bool isFast) { Widget nextButton(BuildContext context, String text, nextScreen, bool isFast) {
final generateWalletProvider = GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context, listen: false); Provider.of<GenerateWalletsProvider>(context, listen: false);
generateWalletProvider.isAskedWordValid = false; generateWalletProvider.isAskedWordValid = false;

View File

@ -1,6 +1,6 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -13,6 +13,7 @@ class OnboardingStepSeven extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,

View File

@ -1,6 +1,6 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -13,6 +13,7 @@ class OnboardingStepEight extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,

View File

@ -1,6 +1,6 @@
// ignore_for_file: file_names // ignore_for_file: file_names
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
@ -16,9 +16,10 @@ class OnboardingStepNine extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final generateWalletProvider = SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
GenerateWalletsProvider generateWalletProvider =
Provider.of<GenerateWalletsProvider>(context); Provider.of<GenerateWalletsProvider>(context);
// final myWalletProvider = // MyWalletsProvider myWalletProvider =
// Provider.of<MyWalletsProvider>(context); // Provider.of<MyWalletsProvider>(context);
CommonElements common = CommonElements(); CommonElements common = CommonElements();
@ -52,7 +53,6 @@ class OnboardingStepNine extends StatelessWidget {
children: <Widget>[ children: <Widget>[
TextField( TextField(
key: keyGeneratedPin, key: keyGeneratedPin,
textCapitalization: TextCapitalization.characters,
enabled: false, enabled: false,
controller: generateWalletProvider.pin, controller: generateWalletProvider.pin,
maxLines: 1, maxLines: 1,

View File

@ -1,5 +1,6 @@
// ignore_for_file: must_be_immutable // ignore_for_file: must_be_immutable
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
@ -16,6 +17,7 @@ class QrCodeFullscreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
return Scaffold( return Scaffold(
appBar: AppBar( appBar: AppBar(
elevation: 0, elevation: 0,

View File

@ -1,48 +1,26 @@
// ignore_for_file: use_build_context_synchronously
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
// import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/search_result.dart'; import 'package:gecko/screens/search_result.dart';
import 'package:gecko/screens/wallet_view.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
// import 'package:gecko/models/home.dart';
// import 'package:provider/provider.dart';
class SearchScreen extends StatefulWidget { class SearchScreen extends StatelessWidget {
const SearchScreen({Key? key}) : super(key: key); const SearchScreen({Key? key}) : super(key: key);
@override
State<SearchScreen> createState() => _SearchScreenState();
}
class _SearchScreenState extends State<SearchScreen> {
bool canPasteAddress = false;
String pastedAddress = '';
Future getClipBoard() async {
final clipboard = await Clipboard.getData('text/plain');
pastedAddress = clipboard?.text ?? '';
canPasteAddress = isAddress(pastedAddress);
}
@override
void initState() {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await getClipBoard();
});
super.initState();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final searchProvider = Provider.of<SearchProvider>(context); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final screenHeight = MediaQuery.of(context).size.height; SearchProvider searchProvider = Provider.of<SearchProvider>(context);
final double screenHeight = MediaQuery.of(context).size.height;
final canValidate = searchProvider.searchController.text.length >= 2; // HomeProvider _homeProvider =
// final canPasteAddress = false; // Provider.of<HomeProvider>(context, listen: false);
return WillPopScope( return WillPopScope(
onWillPop: () { onWillPop: () {
@ -51,6 +29,7 @@ class _SearchScreenState extends State<SearchScreen> {
}, },
child: Scaffold( child: Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
appBar: AppBar( appBar: AppBar(
elevation: 1, elevation: 1,
toolbarHeight: 60 * ratio, toolbarHeight: 60 * ratio,
@ -65,6 +44,7 @@ class _SearchScreenState extends State<SearchScreen> {
Navigator.of(context).pop(); Navigator.of(context).pop();
}), }),
), ),
// bottomNavigationBar: _homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: Stack(children: [ child: Stack(children: [
Column(children: <Widget>[ Column(children: <Widget>[
@ -72,27 +52,12 @@ class _SearchScreenState extends State<SearchScreen> {
Padding( Padding(
padding: const EdgeInsets.symmetric(horizontal: 17), padding: const EdgeInsets.symmetric(horizontal: 17),
child: TextField( child: TextField(
onSubmitted: searchProvider.searchController.text.length >= 2
? (_) {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const SearchResultScreen();
}),
);
}
: (value) {},
textInputAction: TextInputAction.search,
key: keySearchField, key: keySearchField,
controller: searchProvider.searchController, controller: searchProvider.searchController,
autofocus: true, autofocus: true,
maxLines: 1, maxLines: 1,
textAlign: TextAlign.left, textAlign: TextAlign.left,
onChanged: (v) async => { onChanged: (v) => searchProvider.reload(),
await getClipBoard(),
setState(() {}),
searchProvider.reload()
},
decoration: InputDecoration( decoration: InputDecoration(
filled: true, filled: true,
fillColor: Colors.white, fillColor: Colors.white,
@ -125,15 +90,15 @@ class _SearchScreenState extends State<SearchScreen> {
), ),
const Spacer(flex: 1), const Spacer(flex: 1),
SizedBox( SizedBox(
width: 320, width: 410,
height: 90, height: 70,
child: ElevatedButton( child: ElevatedButton(
key: keyConfirmSearch, key: keyConfirmSearch,
style: ElevatedButton.styleFrom( style: ElevatedButton.styleFrom(
foregroundColor: Colors.white, elevation: 4, foregroundColor: Colors.white, elevation: 4,
backgroundColor: orangeC, // foreground backgroundColor: orangeC, // foreground
), ),
onPressed: canValidate onPressed: searchProvider.searchController.text.length >= 2
? () { ? () {
Navigator.push( Navigator.push(
context, context,
@ -142,26 +107,11 @@ class _SearchScreenState extends State<SearchScreen> {
}), }),
); );
} }
: canPasteAddress
? () async {
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return WalletViewScreen(
address: pastedAddress, username: '');
}),
);
}
: null, : null,
child: Text( child: Text(
canValidate 'search'.tr(),
? 'search'.tr()
: canPasteAddress
? 'pasteAddress'.tr()
: 'search'.tr(),
textAlign: TextAlign.center,
style: const TextStyle( style: const TextStyle(
fontSize: 21, fontWeight: FontWeight.w600), fontSize: 24, fontWeight: FontWeight.w600),
), ),
), ),
), ),

View File

@ -1,20 +1,18 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/providers/search.dart'; import 'package:gecko/providers/search.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/screens/wallet_view.dart'; import 'package:gecko/screens/wallet_view.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:gecko/widgets/name_by_address.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class SearchResultScreen extends StatelessWidget { class SearchResultScreen extends StatelessWidget {
@ -22,10 +20,17 @@ class SearchResultScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final searchProvider = Provider.of<SearchProvider>(context, listen: false); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
SearchProvider searchProvider =
Provider.of<SearchProvider>(context, listen: false);
CesiumPlusProvider cesiumPlusProvider =
Provider.of<CesiumPlusProvider>(context, listen: false);
WalletsProfilesProvider walletsProfilesClass = WalletsProfilesProvider walletsProfilesClass =
Provider.of<WalletsProfilesProvider>(context, listen: false); Provider.of<WalletsProfilesProvider>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); HomeProvider homeProvider =
Provider.of<HomeProvider>(context, listen: false);
DuniterIndexer duniterIndexer =
Provider.of<DuniterIndexer>(context, listen: false);
double avatarSize = 55; double avatarSize = 55;
@ -39,7 +44,7 @@ class SearchResultScreen extends StatelessWidget {
child: Text('researchResults'.tr()), child: Text('researchResults'.tr()),
), ),
), ),
bottomNavigationBar: const GeckoBottomAppBar(), bottomNavigationBar: homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: Stack(children: [ child: Stack(children: [
Padding( Padding(
@ -78,6 +83,7 @@ class SearchResultScreen extends StatelessWidget {
if (snapshot.data?.isEmpty ?? true) { if (snapshot.data?.isEmpty ?? true) {
return duniterIndexer.searchIdentity( return duniterIndexer.searchIdentity(
context, searchProvider.searchController.text); context, searchProvider.searchController.text);
// const Text('Aucun résultat'); // const Text('Aucun résultat');
} else { } else {
return Expanded( return Expanded(
@ -91,7 +97,8 @@ class SearchResultScreen extends StatelessWidget {
key: keySearchResult(g1Wallet.address), key: keySearchResult(g1Wallet.address),
horizontalTitleGap: 40, horizontalTitleGap: 40,
contentPadding: const EdgeInsets.all(5), contentPadding: const EdgeInsets.all(5),
leading: defaultAvatar(avatarSize), leading: cesiumPlusProvider
.defaultAvatar(avatarSize),
title: Row(children: <Widget>[ title: Row(children: <Widget>[
Text(getShortPubkey(g1Wallet.address), Text(getShortPubkey(g1Wallet.address),
style: const TextStyle( style: const TextStyle(
@ -115,19 +122,17 @@ class SearchResultScreen extends StatelessWidget {
MainAxisAlignment MainAxisAlignment
.center, .center,
children: [ children: [
Balance( balance(
address: g1Wallet context,
.address, g1Wallet.address,
size: 16), 16),
]), ]),
]), ]),
), ),
]), ]),
subtitle: Row(children: <Widget>[ subtitle: Row(children: <Widget>[
NameByAddress( duniterIndexer.getNameByAddress(
wallet: WalletData( context, g1Wallet.address)
address: g1Wallet.address),
),
]), ]),
dense: false, dense: false,
isThreeLine: false, isThreeLine: false,
@ -139,10 +144,10 @@ class SearchResultScreen extends StatelessWidget {
g1Wallet.address; g1Wallet.address;
return WalletViewScreen( return WalletViewScreen(
address: g1Wallet.address, address: g1Wallet.address,
username: duniterIndexer username: g1WalletsBox
.walletNameIndexer[ .get(g1Wallet.address)
g1Wallet.address] ?? ?.id
'', ?.username,
avatar: g1WalletsBox avatar: g1WalletsBox
.get(g1Wallet.address) .get(g1Wallet.address)
?.avatar, ?.avatar,

View File

@ -1,6 +1,6 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/home.dart'; import 'package:gecko/providers/home.dart';
@ -18,6 +18,8 @@ class SettingsScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
const double buttonHigh = 50; const double buttonHigh = 50;
const double buttonWidth = 240; const double buttonWidth = 240;
const double fontSize = 16; const double fontSize = 16;
@ -108,7 +110,7 @@ class SettingsScreen extends StatelessWidget {
} }
Widget duniterEndpointSelection(BuildContext context) { Widget duniterEndpointSelection(BuildContext context) {
final sub = Provider.of<SubstrateSdk>(context, listen: false); SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
String? selectedDuniterEndpoint; String? selectedDuniterEndpoint;
// List of items in our dropdown menu // List of items in our dropdown menu
@ -269,7 +271,8 @@ class SettingsScreen extends StatelessWidget {
} }
Widget indexerEndpointSelection(BuildContext context) { Widget indexerEndpointSelection(BuildContext context) {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false); DuniterIndexer indexer =
Provider.of<DuniterIndexer>(context, listen: false);
String? selectedIndexerEndpoint; String? selectedIndexerEndpoint;
if (configBox.containsKey('customIndexer')) { if (configBox.containsKey('customIndexer')) {
@ -279,7 +282,7 @@ class SettingsScreen extends StatelessWidget {
} }
if (selectedIndexerEndpoint == '') { if (selectedIndexerEndpoint == '') {
selectedIndexerEndpoint = duniterIndexer.listIndexerEndpoints[0]; selectedIndexerEndpoint = indexer.listIndexerEndpoints[0];
} }
TextEditingController indexerEndpointController = TextEditingController( TextEditingController indexerEndpointController = TextEditingController(

View File

@ -1,3 +1,4 @@
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -6,7 +7,8 @@ class TemplateScreen extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
// final _homeProvider = Provider.of<HomeProvider>(context); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
// HomeProvider _homeProvider = Provider.of<HomeProvider>(context);
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,

View File

@ -1,5 +1,5 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
@ -20,10 +20,11 @@ class TransactionInProgress extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final sub = Provider.of<SubstrateSdk>(context, listen: true); SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
final walletProfiles = SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: true);
WalletsProfilesProvider walletViewProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false); Provider.of<WalletsProfilesProvider>(context, listen: false);
final myWalletProvider = MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
bool isValid = false; bool isValid = false;
@ -34,11 +35,11 @@ class TransactionInProgress extends StatelessWidget {
// sub.spawnBlock(); // sub.spawnBlock();
log.d(walletProfiles.address); log.d(walletViewProvider.address);
final from = fromAddress ?? myWalletProvider.getDefaultWallet().name!; final from = fromAddress ?? myWalletProvider.getDefaultWallet().name!;
final to = toAddress ?? getShortPubkey(walletProfiles.address); final to = toAddress ?? getShortPubkey(walletViewProvider.address);
final amount = walletProfiles.payAmount.text; final amount = walletViewProvider.payAmount.text;
String actionName = ''; String actionName = '';
final bool isUdUnit = configBox.get('isUdUnit') ?? false; final bool isUdUnit = configBox.get('isUdUnit') ?? false;

View File

@ -2,17 +2,16 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:gecko/globals.dart'; import 'package:gecko/globals.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:gecko/models/g1_wallets_list.dart'; import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/widgets_keys.dart'; import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart'; import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/duniter_indexer.dart'; import 'package:gecko/providers/home.dart';
import 'package:gecko/providers/substrate_sdk.dart'; import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/my_wallets.dart'; import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/models/wallet_data.dart'; import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart'; import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/activity.dart'; import 'package:gecko/screens/activity.dart';
import 'package:gecko/screens/common_elements.dart'; import 'package:gecko/screens/common_elements.dart';
@ -20,38 +19,36 @@ import 'package:gecko/screens/myWallets/choose_wallet.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart'; import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/qrcode_fullscreen.dart'; import 'package:gecko/screens/qrcode_fullscreen.dart';
import 'package:gecko/screens/transaction_in_progress.dart'; import 'package:gecko/screens/transaction_in_progress.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/bottom_app_bar.dart';
import 'package:gecko/widgets/header_profile.dart';
import 'package:gecko/widgets/page_route_no_transition.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:qr_flutter/qr_flutter.dart'; import 'package:qr_flutter/qr_flutter.dart';
class WalletViewScreen extends StatelessWidget { class WalletViewScreen extends StatelessWidget {
const WalletViewScreen( const WalletViewScreen(
{required this.address, required this.username, this.avatar, Key? key}) {required this.address, this.username, this.avatar, Key? key})
: super(key: key); : super(key: key);
final String address; final String address;
final String username; final String? username;
final Image? avatar; final Image? avatar;
final double buttonSize = 100; final double buttonSize = 100;
final double buttonFontSize = 18; final double buttonFontSize = 18;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SystemChrome.setPreferredOrientations([DeviceOrientation.portraitUp]);
WalletsProfilesProvider walletProfile = WalletsProfilesProvider walletProfile =
Provider.of<WalletsProfilesProvider>(context, listen: false); Provider.of<WalletsProfilesProvider>(context, listen: false);
final sub = Provider.of<SubstrateSdk>(context, listen: false); CesiumPlusProvider cesiumPlusProvider =
final myWalletProvider = Provider.of<CesiumPlusProvider>(context, listen: false);
walletProfile.address = address;
SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
HomeProvider homeProvider =
Provider.of<HomeProvider>(context, listen: false);
MyWalletsProvider myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false); Provider.of<MyWalletsProvider>(context, listen: false);
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
walletProfile.address = address;
sub.setCurrentWallet(defaultWallet); sub.setCurrentWallet(defaultWallet);
log.d('aaaaaaaaaaaaaaaaaaa: $username');
return Scaffold( return Scaffold(
backgroundColor: backgroundColor, backgroundColor: backgroundColor,
resizeToAvoidBottomInset: true, resizeToAvoidBottomInset: true,
@ -104,20 +101,14 @@ class WalletViewScreen extends StatelessWidget {
], ],
title: SizedBox( title: SizedBox(
height: 22, height: 22,
child: Text(duniterIndexer child: Text('seeAWallet'.tr()),
.walletNameIndexer[walletProfile.address] ==
null
? 'seeAWallet'.tr()
: 'memberAccountOf'.tr(args: [
duniterIndexer.walletNameIndexer[walletProfile.address] ??
'?'
]))),
), ),
bottomNavigationBar: const GeckoBottomAppBar(), ),
bottomNavigationBar: homeProvider.bottomAppBar(context),
body: SafeArea( body: SafeArea(
child: Column(children: <Widget>[ child: Column(children: <Widget>[
HeaderProfile(address: address, username: username), walletProfile.headerProfileView(context, address, username),
SizedBox(height: isTall ? 30 : 15), SizedBox(height: isTall ? 10 : 0),
Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [ Row(mainAxisAlignment: MainAxisAlignment.spaceAround, children: [
Column(children: <Widget>[ Column(children: <Widget>[
SizedBox( SizedBox(
@ -137,10 +128,11 @@ class WalletViewScreen extends StatelessWidget {
onTap: () { onTap: () {
Navigator.push( Navigator.push(
context, context,
PageNoTransit(builder: (context) { MaterialPageRoute(builder: (context) {
return ActivityScreen( return ActivityScreen(
address: address, address: address,
avatar: defaultAvatar(50)); avatar:
cesiumPlusProvider.defaultAvatar(50));
}), }),
); );
}), }),
@ -158,7 +150,7 @@ class WalletViewScreen extends StatelessWidget {
Consumer<SubstrateSdk>(builder: (context, sub, _) { Consumer<SubstrateSdk>(builder: (context, sub, _) {
WalletData? defaultWallet = myWalletProvider.getDefaultWallet(); WalletData? defaultWallet = myWalletProvider.getDefaultWallet();
return FutureBuilder( return FutureBuilder(
future: sub.certState(defaultWallet.address, address), future: sub.certState(defaultWallet.address!, address),
builder: (context, AsyncSnapshot<Map<String, int>> snapshot) { builder: (context, AsyncSnapshot<Map<String, int>> snapshot) {
if (snapshot.data == null) return const SizedBox(); if (snapshot.data == null) return const SizedBox();
String duration = ''; String duration = '';
@ -170,8 +162,8 @@ class WalletViewScreen extends StatelessWidget {
final Duration durationSeconds = Duration( final Duration durationSeconds = Duration(
seconds: snapshot.data!['certDelay'] ?? seconds: snapshot.data!['certDelay'] ??
snapshot.data!['certRenewable']!); snapshot.data!['certRenewable']!);
final seconds = durationSeconds.inSeconds; final int seconds = durationSeconds.inSeconds;
final minutes = durationSeconds.inMinutes; final int minutes = durationSeconds.inMinutes;
if (seconds <= 0) { if (seconds <= 0) {
duration = 'seconds'.tr(args: ['0']); duration = 'seconds'.tr(args: ['0']);
@ -180,8 +172,8 @@ class WalletViewScreen extends StatelessWidget {
} else if (seconds <= 3600) { } else if (seconds <= 3600) {
duration = 'minutes'.tr(args: [minutes.toString()]); duration = 'minutes'.tr(args: [minutes.toString()]);
} else if (seconds <= 86400) { } else if (seconds <= 86400) {
final hours = durationSeconds.inHours; final int hours = durationSeconds.inHours;
final minutesLeft = minutes - hours * 60; final int minutesLeft = minutes - hours * 60;
String showMinutes = ''; String showMinutes = '';
if (minutesLeft < 60) {} if (minutesLeft < 60) {}
showMinutes = showMinutes =
@ -189,10 +181,11 @@ class WalletViewScreen extends StatelessWidget {
duration = duration =
'hours'.tr(args: [hours.toString(), showMinutes]); 'hours'.tr(args: [hours.toString(), showMinutes]);
} else if (seconds <= 2592000) { } else if (seconds <= 2592000) {
final days = durationSeconds.inDays; final int days = durationSeconds.inDays;
duration = 'days'.tr(args: [days.toString()]); duration = 'days'.tr(args: [days.toString()]);
} else { } else {
final months = (durationSeconds.inDays / 30).round(); final int months =
(durationSeconds.inDays / 30).round();
duration = 'months'.tr(args: [months.toString()]); duration = 'months'.tr(args: [months.toString()]);
} }
} }
@ -220,18 +213,12 @@ class WalletViewScreen extends StatelessWidget {
'assets/gecko_certify.png')), 'assets/gecko_certify.png')),
), ),
onTap: () async { onTap: () async {
final bool? result = final bool? result = await confirmPopup(
await confirmPopupCertification(
context, context,
'areYouSureYouWantToCertify1' "areYouSureYouWantToCertify".tr(
.tr(), args: [
duniterIndexer getShortPubkey(address)
.walletNameIndexer[ ]));
address] ??
"noIdentity".tr(),
'areYouSureYouWantToCertify2'
.tr(),
getShortPubkey(address));
if (result ?? false) { if (result ?? false) {
String? pin; String? pin;
@ -275,9 +262,7 @@ class WalletViewScreen extends StatelessWidget {
), ),
const SizedBox(height: 9), const SizedBox(height: 9),
Text( Text(
toStatus == 0 "certify".tr(),
? "certify".tr()
: "createIdentity".tr(),
textAlign: TextAlign.center, textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
fontSize: buttonFontSize, fontSize: buttonFontSize,
@ -437,7 +422,9 @@ void paymentPopup(BuildContext context, String toAddress) {
log.d(pin); log.d(pin);
if (pin != null || myWalletProvider.pinCode != '') { if (pin != null || myWalletProvider.pinCode != '') {
// Payment workflow ! // Payment workflow !
final sub = Provider.of<SubstrateSdk>(context, listen: false); WalletsProfilesProvider walletViewProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false);
SubstrateSdk sub = Provider.of<SubstrateSdk>(context, listen: false);
final acc = sub.getCurrentWallet(); final acc = sub.getCurrentWallet();
log.d( log.d(
"fromAddress: ${acc.address!},destAddress: $toAddress, amount: ${double.parse(walletViewProvider.payAmount.text)}, password: $pin"); "fromAddress: ${acc.address!},destAddress: $toAddress, amount: ${double.parse(walletViewProvider.payAmount.text)}, password: $pin");
@ -466,19 +453,16 @@ void paymentPopup(BuildContext context, String toAddress) {
context: context, context: context,
builder: (BuildContext context) { builder: (BuildContext context) {
final sub = Provider.of<SubstrateSdk>(homeContext, listen: false); final sub = Provider.of<SubstrateSdk>(homeContext, listen: false);
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
double fees = 0; double fees = 0;
return StatefulBuilder( return StatefulBuilder(
builder: (BuildContext context, StateSetter setState) { builder: (BuildContext context, StateSetter setState) {
if (walletViewProvider.payAmount.text != '' && if (walletViewProvider.payAmount.text != '' &&
(double.parse(walletViewProvider.payAmount.text) + (double.parse(walletViewProvider.payAmount.text) +
2 / balanceRatio) <= 2 / balanceRatio) <=
(walletOptions.balanceCache[defaultWallet.address] ?? 0) && (balanceCache[defaultWallet.address] ?? 0) &&
toAddress != defaultWallet.address) { toAddress != defaultWallet.address) {
if ((walletOptions.balanceCache[toAddress] == 0 || if ((balanceCache[toAddress] == 0 ||
walletOptions.balanceCache[toAddress] == null) && balanceCache[toAddress] == null) &&
double.parse(walletViewProvider.payAmount.text) < double.parse(walletViewProvider.payAmount.text) <
5 / balanceRatio) { 5 / balanceRatio) {
canValidate = false; canValidate = false;
@ -573,7 +557,7 @@ void paymentPopup(BuildContext context, String toAddress) {
child: Row(children: [ child: Row(children: [
Text(defaultWallet.name!), Text(defaultWallet.name!),
const Spacer(), const Spacer(),
Balance(address: defaultWallet.address, size: 20), balance(context, defaultWallet.address!, 20)
]), ]),
), ),
); );
@ -640,7 +624,7 @@ void paymentPopup(BuildContext context, String toAddress) {
keyboardType: TextInputType.number, keyboardType: TextInputType.number,
onChanged: (_) async { onChanged: (_) async {
fees = await sub.txFees( fees = await sub.txFees(
defaultWallet.address, defaultWallet.address!,
toAddress, toAddress,
double.parse( double.parse(
walletViewProvider.payAmount.text == '' walletViewProvider.payAmount.text == ''

View File

@ -1,75 +0,0 @@
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/widgets/ud_unit_display.dart';
import 'package:provider/provider.dart';
class Balance extends StatelessWidget {
const Balance(
{Key? key,
required this.address,
required this.size,
this.color = Colors.black,
this.loadingColor = const Color(0xffd07316)})
: super(key: key);
final String address;
final double size;
final Color color;
final Color loadingColor;
@override
Widget build(BuildContext context) {
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getBalance(address),
builder: (BuildContext context,
AsyncSnapshot<Map<String, double>> globalBalance) {
if (globalBalance.connectionState != ConnectionState.done ||
globalBalance.hasError) {
if (walletOptions.balanceCache[address] != null &&
walletOptions.balanceCache[address] != -1) {
return Row(children: [
Text(walletOptions.balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
color: color)),
const SizedBox(width: 5),
UdUnitDisplay(size: size, color: color),
]);
} else {
return SizedBox(
height: 15,
width: 15,
child: CircularProgressIndicator(
color: loadingColor,
strokeWidth: 2,
),
);
}
}
walletOptions.balanceCache[address] =
globalBalance.data!['transferableBalance']!;
if (walletOptions.balanceCache[address] != -1) {
return Row(children: [
Text(
walletOptions.balanceCache[address]!.toString(),
style: TextStyle(
fontSize: isTall ? size : size * 0.9,
color: color,
),
),
const SizedBox(width: 5),
UdUnitDisplay(size: size, color: color),
]);
} else {
return const Text('');
}
});
}),
]);
}
}

View File

@ -1,140 +0,0 @@
// ignore_for_file: use_build_context_synchronously
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/my_wallets.dart';
import 'package:gecko/providers/search.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/myWallets/unlocking_wallet.dart';
import 'package:gecko/screens/myWallets/wallets_home.dart';
import 'package:gecko/screens/search.dart';
import 'package:provider/provider.dart';
class GeckoBottomAppBar extends StatelessWidget {
const GeckoBottomAppBar({Key? key, this.actualRoute = ''}) : super(key: key);
final String actualRoute;
@override
Widget build(BuildContext context) {
final myWalletProvider =
Provider.of<MyWalletsProvider>(context, listen: false);
final historyProvider =
Provider.of<WalletsProfilesProvider>(context, listen: false);
final searchProvider = Provider.of<SearchProvider>(context, listen: false);
final size = MediaQuery.of(context).size;
const bool showBottomBar = true;
final lockAction = actualRoute == 'safeHome';
return Visibility(
visible: showBottomBar,
child: Container(
color: yellowC,
width: size.width,
height: 80,
child: Row(mainAxisAlignment: MainAxisAlignment.start, children: [
const Spacer(),
const SizedBox(width: 11),
IconButton(
key: keyAppBarSearch,
iconSize: 40,
icon: const Image(image: AssetImage('assets/loupe-noire.png')),
onPressed: () {
searchProvider.reload();
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
Navigator.push(
context,
MaterialPageRoute(builder: (homeContext) {
return const SearchScreen();
}),
);
},
),
const SizedBox(width: 22),
const Spacer(),
IconButton(
key: keyAppBarQrcode,
iconSize: 70,
icon: const Image(image: AssetImage('assets/qrcode-scan.png')),
onPressed: () async {
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
historyProvider.scan(homeContext);
},
),
const Spacer(),
const SizedBox(width: 15),
Stack(
children: [
if (lockAction)
Center(
child: Padding(
padding: const EdgeInsets.only(left: 0),
child: Container(
width: 75,
height: 75,
decoration: BoxDecoration(
shape: BoxShape.circle,
border:
Border.all(color: orangeC.withOpacity(0), width: 3),
gradient: RadialGradient(
radius: 0.5,
colors: [
yellowC,
orangeC.withOpacity(0.1),
],
),
),
),
),
),
IconButton(
key: keyAppBarChest,
iconSize: 60,
icon: const Image(image: AssetImage('assets/wallet.png')),
onPressed: lockAction
? null
: () async {
WalletData? defaultWallet =
myWalletProvider.getDefaultWallet();
String? pin;
if (myWalletProvider.pinCode == '') {
pin = await Navigator.push(
context,
MaterialPageRoute(
builder: (homeContext) {
return UnlockingWallet(wallet: defaultWallet);
},
),
);
}
if (pin != null || myWalletProvider.pinCode != '') {
Navigator.popUntil(
context,
ModalRoute.withName('/'),
);
Navigator.push(
context,
MaterialPageRoute(builder: (context) {
return const WalletsHome();
}),
);
}
},
),
],
),
const Spacer(),
]),
),
);
}
}

View File

@ -1,87 +0,0 @@
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/screens/wallet_view.dart';
class CertTile extends StatelessWidget {
const CertTile({
Key? key,
required this.listCerts,
}) : super(key: key);
final List listCerts;
@override
Widget build(BuildContext context) {
int keyID = 0;
const double avatarSize = 200;
return Column(
children: listCerts.map((repository) {
// log.d('bbbbbbbbbbbbbbbbbbbbbb: ' + repository.toString());
return Column(children: <Widget>[
Padding(
padding: const EdgeInsets.only(right: 0),
child:
// Row(children: [Column(children: [],)],)
ListTile(
key: keyTransaction(keyID++),
contentPadding: const EdgeInsets.only(
left: 20, right: 30, top: 15, bottom: 15),
leading: ClipOval(
child: defaultAvatar(avatarSize),
),
title: Padding(
padding: const EdgeInsets.only(bottom: 5),
child: Text(repository['name'],
style: const TextStyle(fontSize: 20)),
),
subtitle: RichText(
text: TextSpan(
style: TextStyle(
fontSize: 16,
color: Colors.grey[700],
),
children: <TextSpan>[
TextSpan(
text: repository['date'],
),
if (repository[2] != '')
TextSpan(
text: ' · ',
style: TextStyle(
fontSize: 20,
color: Colors.grey[550],
),
),
TextSpan(
text: getShortPubkey(repository['address']),
style: TextStyle(
fontStyle: FontStyle.italic,
color: Colors.grey[600],
),
),
],
),
),
dense: false,
isThreeLine: false,
onTap: () {
Navigator.push(
homeContext,
MaterialPageRoute(builder: (context) {
return WalletViewScreen(
address: repository['address'],
username: repository['name'],
);
}),
);
}),
),
]);
}).toList());
}
}

View File

@ -1,44 +0,0 @@
import 'package:flutter/material.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
class Certifications extends StatelessWidget {
const Certifications(
{Key? key,
required this.address,
required this.size,
this.color = Colors.black})
: super(key: key);
final String address;
final double size;
final Color color;
@override
Widget build(BuildContext context) {
return Column(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sdk, _) {
return FutureBuilder(
future: sdk.getCertsCounter(address),
builder: (BuildContext context, AsyncSnapshot<List<int>> certs) {
// log.d(_certs.data);
return certs.data?[0] != 0 && certs.data != null
? Row(
children: [
Image.asset('assets/medal.png', height: 20),
const SizedBox(width: 1),
Text(certs.data?[0].toString() ?? '0',
style: const TextStyle(fontSize: 20)),
const SizedBox(width: 5),
Text(
"(${certs.data?[1].toString() ?? '0'})",
style: const TextStyle(fontSize: 14),
)
],
)
: const Text('');
});
}),
]);
}
}

View File

@ -1,17 +0,0 @@
import 'package:flutter/material.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
class CertsCounter extends StatelessWidget {
const CertsCounter({Key? key, required this.address, this.isSent = false})
: super(key: key);
final String address;
final bool isSent;
@override
Widget build(BuildContext context) {
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return Text('(${sub.certsCounterCache[address]![isSent ? 1 : 0]})');
});
}
}

View File

@ -1,104 +0,0 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/queries_indexer.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/widgets/cert_tile.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
class CertsReceived extends StatelessWidget {
const CertsReceived({Key? key, required this.address}) : super(key: key);
final String address;
@override
Widget build(BuildContext context) {
final screenHeight = MediaQuery.of(context).size.height;
final appBarHeight = AppBar().preferredSize.height;
log.d(appBarHeight);
final windowHeight = screenHeight - appBarHeight - 200;
final httpLink = HttpLink(
'$indexerEndpoint/v1/graphql',
);
final client = ValueNotifier(
GraphQLClient(
cache: GraphQLCache(store: HiveStore()),
link: httpLink,
),
);
return GraphQLProvider(
client: client,
child: Query(
options: QueryOptions(
document: gql(getCertsReceived),
variables: <String, dynamic>{
'address': address,
},
),
builder: (QueryResult result, {fetchMore, refetch}) {
if (result.isLoading && result.data == null) {
return const Center(
child: CircularProgressIndicator(),
);
}
if (result.hasException || result.data == null) {
log.e('Error Indexer: ${result.exception}');
return Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noNetworkNoHistory".tr(),
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 18),
)
]);
} else if (result.data?['certification']?.isEmpty) {
return Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noDataToDisplay".tr(),
style: const TextStyle(fontSize: 18),
)
]);
}
// Build history list
return SizedBox(
height: windowHeight,
child: ListView(
key: keyListTransactions,
children: <Widget>[certsView(result)],
),
);
},
),
);
}
Widget certsView(QueryResult result) {
List listCerts = [];
final List certsData = result.data!['certification'];
for (final cert in certsData) {
final String issuerAddress = cert['issuer']['pubkey'];
final String issuerName = cert['issuer']['name'];
final date = DateTime.parse(cert['created_at']);
final dp = DateTime(date.year, date.month, date.day);
final dateForm = '${dp.day}-${dp.month}-${dp.year}';
listCerts.add(
{'address': issuerAddress, 'name': issuerName, 'date': dateForm});
}
return result.data == null
? Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noTransactionToDisplay".tr(),
style: const TextStyle(fontSize: 18),
)
])
: Column(children: <Widget>[
CertTile(listCerts: listCerts),
]);
}
}

View File

@ -1,105 +0,0 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/queries_indexer.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/widgets/cert_tile.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
class CertsSent extends StatelessWidget {
const CertsSent({Key? key, required this.address}) : super(key: key);
final String address;
@override
Widget build(BuildContext context) {
final screenHeight = MediaQuery.of(context).size.height;
final appBarHeight = AppBar().preferredSize.height;
log.d(appBarHeight);
final windowHeight = screenHeight - appBarHeight - 200;
final httpLink = HttpLink(
'$indexerEndpoint/v1/graphql',
);
final client = ValueNotifier(
GraphQLClient(
cache: GraphQLCache(store: HiveStore()),
link: httpLink,
),
);
return GraphQLProvider(
client: client,
child: Query(
options: QueryOptions(
document: gql(getCertsSent),
variables: <String, dynamic>{
'address': address,
},
),
builder: (QueryResult result, {fetchMore, refetch}) {
if (result.isLoading && result.data == null) {
return const Center(
child: CircularProgressIndicator(),
);
}
if (result.hasException || result.data == null) {
log.e('Error Indexer: ${result.exception}');
return Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noNetworkNoHistory".tr(),
textAlign: TextAlign.center,
style: const TextStyle(fontSize: 18),
)
]);
} else if (result.data?['certification']?.isEmpty) {
return Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noDataToDisplay".tr(),
style: const TextStyle(fontSize: 18),
)
]);
}
// Build history list
return SizedBox(
height: windowHeight,
child: ListView(
key: keyListTransactions,
children: <Widget>[certsView(result)],
),
);
},
),
);
}
Widget certsView(QueryResult result) {
List listCerts = [];
final List certsData = result.data!['certification'];
for (final cert in certsData) {
final String issuerAddress = cert['receiver']['pubkey'];
final String issuerName = cert['receiver']['name'];
final date = DateTime.parse(cert['created_at']);
final dp = DateTime(date.year, date.month, date.day);
final dateForm = '${dp.day}-${dp.month}-${dp.year}';
listCerts.add(
{'address': issuerAddress, 'name': issuerName, 'date': dateForm});
}
return result.data == null
? Column(children: <Widget>[
const SizedBox(height: 50),
Text(
"noTransactionToDisplay".tr(),
style: const TextStyle(fontSize: 18),
)
])
: Column(children: <Widget>[
CertTile(listCerts: listCerts),
]);
}
}

View File

@ -1,117 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/widgets_keys.dart';
import 'package:gecko/providers/cesium_plus.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/providers/wallet_options.dart';
import 'package:gecko/providers/wallets_profiles.dart';
import 'package:gecko/screens/certifications.dart';
import 'package:gecko/screens/common_elements.dart';
import 'package:gecko/widgets/balance.dart';
import 'package:gecko/widgets/certifications.dart';
import 'package:gecko/widgets/idty_status.dart';
import 'package:gecko/widgets/page_route_no_transition.dart';
import 'package:provider/provider.dart';
class HeaderProfile extends StatelessWidget {
const HeaderProfile({
Key? key,
required this.address,
required this.username,
}) : super(key: key);
final String address;
final String? username;
@override
Widget build(BuildContext context) {
const double avatarSize = 140;
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
final walletOptions =
Provider.of<WalletOptionsProvider>(context, listen: false);
return Stack(children: <Widget>[
Consumer<SubstrateSdk>(builder: (context, sub, _) {
bool isAccountExist = walletOptions.balanceCache[address] != 0;
return Container(
height: 180,
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
colors: [
isAccountExist ? yellowC : Colors.grey[400]!,
isAccountExist ? const Color(0xFFE7811A) : Colors.grey[600]!,
],
),
));
}),
Padding(
padding: const EdgeInsets.only(left: 30, right: 40),
child: Row(children: <Widget>[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Container(
height: 10,
color: yellowC,
),
Row(children: [
GestureDetector(
key: keyCopyAddress,
onTap: () {
Clipboard.setData(ClipboardData(text: address));
snackCopyKey(context);
},
child: Text(
getShortPubkey(address),
style: const TextStyle(
fontSize: 30,
fontWeight: FontWeight.w800,
),
),
),
]),
const SizedBox(height: 25),
Balance(address: address, size: 22),
const SizedBox(height: 10),
InkWell(
onTap: () => duniterIndexer.walletNameIndexer[address] != null
? {
Navigator.push(
context,
PageNoTransit(builder: (context) {
return CertificationsScreen(
address: address,
username: duniterIndexer
.walletNameIndexer[address]!);
}),
),
}
: null,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
IdentityStatus(
address: address,
isOwner: false,
color: Colors.black),
Certifications(address: address, size: 14)
],
),
),
]),
const Spacer(),
Column(children: <Widget>[
ClipOval(
child: defaultAvatar(avatarSize),
),
]),
]),
),
CommonElements().offlineInfo(context),
]);
}
}

View File

@ -1,90 +0,0 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:gecko/widgets/animated_text.dart';
import 'package:gecko/widgets/name_by_address.dart';
import 'package:provider/provider.dart';
class IdentityStatus extends StatelessWidget {
const IdentityStatus(
{Key? key,
required this.address,
this.isOwner = false,
this.color = Colors.black})
: super(key: key);
final String address;
final bool isOwner;
final Color color;
@override
Widget build(BuildContext context) {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return FutureBuilder(
future: sub.idtyStatus(address),
initialData: '',
builder: (context, snapshot) {
duniterIndexer.idtyStatusCache[address] = snapshot.data.toString();
switch (snapshot.data.toString()) {
case 'noid':
{
return showText('noIdentity'.tr());
}
case 'Created':
{
return showText('identityCreated'.tr());
}
case 'ConfirmedByOwner':
{
return isOwner
? showText('identityConfirmed'.tr())
: NameByAddress(
wallet: WalletData(address: address),
size: 20,
color: Colors.grey[700]!,
fontWeight: FontWeight.w500,
fontStyle: FontStyle.italic);
}
case 'Validated':
{
return isOwner
? showText('memberValidated'.tr(), 18, true)
: NameByAddress(
wallet: WalletData(address: address),
size: 20,
color: Colors.black,
fontWeight: FontWeight.w600,
fontStyle: FontStyle.normal);
}
case 'expired':
{
return showText('identityExpired'.tr());
}
}
return SizedBox(
child: showText('', 18, false, false),
);
});
});
}
AnimatedFadeOutIn showText(String text,
[double size = 18, bool bold = false, bool smooth = true]) {
// log.d('$address $text');
return AnimatedFadeOutIn<String>(
data: text,
duration: Duration(milliseconds: smooth ? 200 : 0),
builder: (value) => Text(
value,
textAlign: TextAlign.center,
style: TextStyle(
fontSize: size,
color: bold ? color : Colors.black,
fontWeight: bold ? FontWeight.w500 : FontWeight.w400),
),
);
}
}

View File

@ -1,97 +0,0 @@
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/g1_wallets_list.dart';
import 'package:gecko/models/queries_indexer.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:gecko/providers/duniter_indexer.dart';
import 'package:gecko/widgets/wallet_name.dart';
import 'package:graphql_flutter/graphql_flutter.dart';
import 'package:provider/provider.dart';
import 'package:truncate/truncate.dart';
class NameByAddress extends StatelessWidget {
const NameByAddress(
{Key? key,
required this.wallet,
this.size = 20,
this.color = Colors.black,
this.fontWeight = FontWeight.w400,
this.fontStyle = FontStyle.italic})
: super(key: key);
final WalletData wallet;
final Color color;
final double size;
final FontWeight fontWeight;
final FontStyle fontStyle;
@override
Widget build(BuildContext context) {
final duniterIndexer = Provider.of<DuniterIndexer>(context, listen: false);
if (indexerEndpoint == '') {
return WalletName(wallet: wallet, size: size, color: color);
}
final httpLink = HttpLink(
'$indexerEndpoint/v1/graphql',
);
final client = ValueNotifier(
GraphQLClient(
cache: GraphQLCache(store: HiveStore()),
link: httpLink,
),
);
return GraphQLProvider(
client: client,
child: Query(
options: QueryOptions(
document: gql(
getNameByAddressQ), // this is the query string you just created
variables: {
'address': wallet.address,
},
// pollInterval: const Duration(seconds: 10),
),
builder: (QueryResult result,
{VoidCallback? refetch, FetchMore? fetchMore}) {
if (result.hasException) {
return Text(result.exception.toString());
}
if (result.isLoading) {
return const Text('Loading');
}
duniterIndexer.walletNameIndexer[wallet.address] =
result.data?['account_by_pk']?['identity']?['name'];
g1WalletsBox.put(
wallet.address,
G1WalletsList(
address: wallet.address,
username:
duniterIndexer.walletNameIndexer[wallet.address]));
// log.d(g1WalletsBox.toMap().values.first.username);
if (duniterIndexer.walletNameIndexer[wallet.address] == null) {
return WalletName(wallet: wallet, size: size, color: color);
}
return Text(
color == Colors.grey[700]!
? '(${duniterIndexer.walletNameIndexer[wallet.address]!})'
: truncate(
duniterIndexer.walletNameIndexer[wallet.address]!, 20),
style: TextStyle(
fontSize: size,
color: color,
fontWeight: fontWeight,
fontStyle: fontStyle,
),
);
}),
);
}
}

View File

@ -1,8 +0,0 @@
import 'package:flutter/material.dart';
class PageNoTransit extends MaterialPageRoute {
PageNoTransit({builder}) : super(builder: builder);
@override
Duration get transitionDuration => const Duration(milliseconds: 0);
}

View File

@ -1,18 +0,0 @@
import 'package:flutter/material.dart';
import 'package:gecko/providers/substrate_sdk.dart';
import 'package:provider/provider.dart';
class TemplateWidget extends StatelessWidget {
const TemplateWidget(
{Key? key, required this.address, this.color = Colors.black})
: super(key: key);
final String address;
final Color color;
@override
Widget build(BuildContext context) {
return Consumer<SubstrateSdk>(builder: (context, sub, _) {
return const Text('Hello Widget');
});
}
}

View File

@ -1,45 +0,0 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
class UdUnitDisplay extends StatelessWidget {
const UdUnitDisplay({
Key? key,
required this.size,
required this.color,
}) : super(key: key);
final double size;
final Color color;
@override
Widget build(BuildContext context) {
final bool isUdUnit = configBox.get('isUdUnit') ?? false;
return isUdUnit
? Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
Text(
'ud'.tr(args: ['']),
style: TextStyle(
fontSize: isTall ? size : size * 0.9, color: color),
),
Column(
children: [
Text(
currencyName,
style: TextStyle(
fontSize: (isTall ? size : size * 0.9) * 0.7,
fontWeight: FontWeight.w500,
color: color),
),
const SizedBox(height: 15)
],
)
],
)
: Text(currencyName,
style:
TextStyle(fontSize: isTall ? size : size * 0.9, color: color));
}
}

View File

@ -1,36 +0,0 @@
import 'package:flutter/material.dart';
import 'package:gecko/globals.dart';
import 'package:gecko/models/wallet_data.dart';
import 'package:truncate/truncate.dart';
class WalletName extends StatelessWidget {
const WalletName(
{Key? key,
required this.wallet,
this.size = 20,
this.color = Colors.black})
: super(key: key);
final WalletData wallet;
final double size;
final Color color;
@override
Widget build(BuildContext context) {
double newSize = (wallet.name?.length ?? 0) <= 15 ? size : size - 2;
return Row(mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[
Text(
truncate(wallet.name ?? '', 20),
textAlign: TextAlign.center,
style: TextStyle(
fontSize: isTall ? newSize : newSize * 0.9,
color: color,
fontWeight: FontWeight.w400,
fontStyle: FontStyle.italic,
),
softWrap: false,
overflow: TextOverflow.ellipsis,
),
]);
}
}

View File

@ -8,13 +8,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "50.0.0" version: "50.0.0"
accordion:
dependency: "direct main"
description:
name: accordion
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.1"
analyzer: analyzer:
dependency: transitive dependency: transitive
description: description:
@ -57,6 +50,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.9.0" version: "2.9.0"
auth_header:
dependency: transitive
description:
name: auth_header
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
barcode: barcode:
dependency: transitive dependency: transitive
description: description:
@ -71,13 +71,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.1" version: "4.2.1"
bip32:
dependency: transitive
description:
name: bip32
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
bip32_ed25519: bip32_ed25519:
dependency: transitive dependency: transitive
description: description:
@ -85,13 +78,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.2" version: "0.2.2"
bip39:
dependency: transitive
description:
name: bip39
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.6"
bip39_multi_nullsafety: bip39_multi_nullsafety:
dependency: transitive dependency: transitive
description: description:
@ -106,13 +92,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
bs58check:
dependency: transitive
description:
name: bs58check
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
bubble: bubble:
dependency: "direct main" dependency: "direct main"
description: description:
@ -224,7 +203,21 @@ packages:
name: connectivity_plus name: connectivity_plus
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.2" version: "2.3.9"
connectivity_plus_linux:
dependency: transitive
description:
name: connectivity_plus_linux
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.1"
connectivity_plus_macos:
dependency: transitive
description:
name: connectivity_plus_macos
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.6"
connectivity_plus_platform_interface: connectivity_plus_platform_interface:
dependency: transitive dependency: transitive
description: description:
@ -232,6 +225,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.3" version: "1.2.3"
connectivity_plus_web:
dependency: transitive
description:
name: connectivity_plus_web
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.5"
connectivity_plus_windows:
dependency: transitive
description:
name: connectivity_plus_windows
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.2"
convert: convert:
dependency: transitive dependency: transitive
description: description:
@ -266,7 +273,7 @@ packages:
name: dart_code_metrics name: dart_code_metrics
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.0" version: "5.0.1"
dart_style: dart_style:
dependency: transitive dependency: transitive
description: description:
@ -281,13 +288,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.7.8" version: "0.7.8"
decimal:
dependency: transitive
description:
name: decimal
url: "https://pub.dartlang.org"
source: hosted
version: "2.3.2"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
@ -323,20 +323,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.0.2" version: "0.0.2"
eip55:
dependency: transitive
description:
name: eip55
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.2"
ethers:
dependency: transitive
description:
name: ethers
url: "https://pub.dartlang.org"
source: hosted
version: "0.0.1+3"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
@ -345,7 +331,7 @@ packages:
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
fast_base58: fast_base58:
dependency: "direct main" dependency: transitive
description: description:
name: fast_base58 name: fast_base58
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
@ -409,7 +395,7 @@ packages:
name: flutter_inappwebview name: flutter_inappwebview
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.7.2+2" version: "5.3.2"
flutter_lints: flutter_lints:
dependency: "direct main" dependency: "direct main"
description: description:
@ -436,13 +422,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.7" version: "2.0.7"
flutter_svg:
dependency: "direct main"
description:
name: flutter_svg
url: "https://pub.dartlang.org"
source: hosted
version: "1.1.6"
flutter_test: flutter_test:
dependency: "direct dev" dependency: "direct dev"
description: flutter description: flutter
@ -536,19 +515,19 @@ packages:
source: hosted source: hosted
version: "0.2.2+1" version: "0.2.2+1"
graphql: graphql:
dependency: "direct main" dependency: transitive
description: description:
name: graphql name: graphql
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.2-beta.6" version: "5.1.2-beta.5"
graphql_flutter: graphql_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: graphql_flutter name: graphql_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "5.1.1-beta.5" version: "5.1.1-beta.4"
graphs: graphs:
dependency: transitive dependency: transitive
description: description:
@ -577,13 +556,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
hive_generator:
dependency: "direct main"
description:
name: hive_generator
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.0"
html: html:
dependency: transitive dependency: transitive
description: description:
@ -612,6 +584,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.2" version: "4.0.2"
http_server:
dependency: transitive
description:
name: http_server
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.0"
icons_launcher: icons_launcher:
dependency: "direct dev" dependency: "direct dev"
description: description:
@ -701,6 +680,27 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.3"
jaguar:
dependency: transitive
description:
name: jaguar
url: "https://pub.dartlang.org"
source: hosted
version: "3.1.3"
jaguar_common:
dependency: transitive
description:
name: jaguar_common
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
jaguar_flutter_asset:
dependency: transitive
description:
name: jaguar_flutter_asset
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
jdenticon_dart: jdenticon_dart:
dependency: "direct main" dependency: "direct main"
description: description:
@ -722,13 +722,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.7.0" version: "4.7.0"
json_rpc_2:
dependency: transitive
description:
name: json_rpc_2
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.2"
lints: lints:
dependency: transitive dependency: transitive
description: description:
@ -784,7 +777,7 @@ packages:
name: mime name: mime
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.3" version: "1.0.2"
mobx: mobx:
dependency: transitive dependency: transitive
description: description:
@ -841,13 +834,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.2" version: "1.8.2"
path_drawing:
dependency: transitive
description:
name: path_drawing
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
path_parsing: path_parsing:
dependency: transitive dependency: transitive
description: description:
@ -904,6 +890,13 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.3" version: "2.1.3"
path_tree:
dependency: transitive
description:
name: path_tree
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.0"
pdf: pdf:
dependency: "direct main" dependency: "direct main"
description: description:
@ -961,7 +954,7 @@ packages:
source: hosted source: hosted
version: "7.4.0" version: "7.4.0"
pinenacl: pinenacl:
dependency: "direct main" dependency: transitive
description: description:
name: pinenacl name: pinenacl
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
@ -992,11 +985,11 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "." path: "."
ref: d45eb8d787d625331e6425df5cec9c5d33b30d35 ref: gecko-unwrapbytes
resolved-ref: d45eb8d787d625331e6425df5cec9c5d33b30d35 resolved-ref: b019cc2a6e77b6989f94b1bef8259298410cd82a
url: "https://github.com/poka-IT/sdk.git" url: "https://github.com/poka-IT/sdk.git"
source: git source: git
version: "0.5.0" version: "0.4.8"
pool: pool:
dependency: transitive dependency: transitive
description: description:
@ -1069,13 +1062,6 @@ packages:
url: "https://github.com/insinfo/qr.flutter.git" url: "https://github.com/insinfo/qr.flutter.git"
source: git source: git
version: "4.0.0" version: "4.0.0"
rational:
dependency: transitive
description:
name: rational
url: "https://pub.dartlang.org"
source: hosted
version: "2.2.2"
responsive_framework: responsive_framework:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1090,34 +1076,20 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.27.7" version: "0.27.7"
scroll_to_index:
dependency: transitive
description:
name: scroll_to_index
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
sec:
dependency: transitive
description:
name: sec
url: "https://pub.dartlang.org"
source: hosted
version: "1.0.1"
sentry: sentry:
dependency: transitive dependency: transitive
description: description:
name: sentry name: sentry
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.18.0" version: "6.16.1"
sentry_flutter: sentry_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: sentry_flutter name: sentry_flutter
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.18.0" version: "6.16.1"
shared_preferences: shared_preferences:
dependency: "direct main" dependency: "direct main"
description: description:
@ -1193,20 +1165,6 @@ packages:
description: flutter description: flutter
source: sdk source: sdk
version: "0.0.99" version: "0.0.99"
source_gen:
dependency: transitive
description:
name: source_gen
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.6"
source_helper:
dependency: transitive
description:
name: source_helper
url: "https://pub.dartlang.org"
source: hosted
version: "1.3.3"
source_span: source_span:
dependency: transitive dependency: transitive
description: description:
@ -1298,62 +1256,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.0" version: "0.2.0"
url_launcher:
dependency: transitive
description:
name: url_launcher
url: "https://pub.dartlang.org"
source: hosted
version: "6.1.7"
url_launcher_android:
dependency: transitive
description:
name: url_launcher_android
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.22"
url_launcher_ios:
dependency: transitive
description:
name: url_launcher_ios
url: "https://pub.dartlang.org"
source: hosted
version: "6.0.17"
url_launcher_linux:
dependency: transitive
description:
name: url_launcher_linux
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
url_launcher_macos:
dependency: transitive
description:
name: url_launcher_macos
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
url_launcher_platform_interface:
dependency: transitive
description:
name: url_launcher_platform_interface
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
url_launcher_web:
dependency: transitive
description:
name: url_launcher_web
url: "https://pub.dartlang.org"
source: hosted
version: "2.0.13"
url_launcher_windows:
dependency: transitive
description:
name: url_launcher_windows
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.1"
uuid: uuid:
dependency: transitive dependency: transitive
description: description:
@ -1382,13 +1284,6 @@ packages:
url: "https://pub.dartlang.org" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.2" version: "1.0.2"
web3dart:
dependency: transitive
description:
name: web3dart
url: "https://pub.dartlang.org"
source: hosted
version: "2.5.1"
web_socket_channel: web_socket_channel:
dependency: transitive dependency: transitive
description: description:

View File

@ -5,7 +5,7 @@ description: Pay with G1.
# pub.dev using `pub publish`. This is preferred for private packages. # pub.dev using `pub publish`. This is preferred for private packages.
publish_to: 'none' # Remove this line if you wish to publish to pub.dev publish_to: 'none' # Remove this line if you wish to publish to pub.dev
version: 0.0.15+48 version: 0.0.12+33
environment: environment:
sdk: '>=2.12.0 <3.0.0' sdk: '>=2.12.0 <3.0.0'
@ -18,16 +18,16 @@ dependencies:
bubble: ^1.2.1 bubble: ^1.2.1
carousel_slider: ^4.0.0 carousel_slider: ^4.0.0
flutter_lints: ^2.0.1 flutter_lints: ^2.0.1
graphql_flutter: ^5.1.1-beta.4 graphql_flutter: ^5.1.1-beta.3
hive_flutter: ^1.1.0 hive_flutter: ^1.1.0
image_picker: ^0.8.4 image_picker: ^0.8.4
jdenticon_dart: ^2.0.0 jdenticon_dart: ^2.0.0
logger: ^1.1.0 logger: ^1.1.0
path_provider: ^2.0.11 path_provider: ^2.0.9
pdf: ^3.7.1 pdf: ^3.7.1
permission_handler: ^10.0.0 permission_handler: ^10.0.0
pin_code_fields: ^7.4.0 pin_code_fields: ^7.3.0
printing: ^5.9.3 printing: ^5.9.1
provider: ^6.0.1 provider: ^6.0.1
barcode_scan2: ^4.2.1 barcode_scan2: ^4.2.1
qr_flutter: #^4.0.0 qr_flutter: #^4.0.0
@ -35,7 +35,7 @@ dependencies:
url: https://github.com/insinfo/qr.flutter.git url: https://github.com/insinfo/qr.flutter.git
ref: master ref: master
responsive_framework: ^0.2.0 responsive_framework: ^0.2.0
sentry_flutter: ^6.18.0 sentry_flutter: ^6.5.1
shared_preferences: ^2.0.7 shared_preferences: ^2.0.7
truncate: ^3.0.1 truncate: ^3.0.1
unorm_dart: ^0.2.0 unorm_dart: ^0.2.0
@ -48,22 +48,15 @@ dependencies:
# ref: develop # ref: develop
url: https://github.com/poka-IT/sdk.git url: https://github.com/poka-IT/sdk.git
# ref: gecko-old # ref: gecko-old
# ref: ec61ebab45287315fa1d7e84830a01d6e23891ae ref: gecko-unwrapbytes
ref: d45eb8d787d625331e6425df5cec9c5d33b30d35
dots_indicator: ^2.1.0 dots_indicator: ^2.1.0
connectivity_plus: ^3.0.2 connectivity_plus: ^2.3.3
image_cropper: ^3.0.0 image_cropper: ^3.0.0
easy_localization: ^3.0.1 easy_localization: ^3.0.1
flutter_markdown: ^0.6.10+2 flutter_markdown: ^0.6.10+2
pointycastle: ^3.6.1 pointycastle: ^3.6.1
hex: ^0.2.0 hex: ^0.2.0
flutter_dotenv: ^5.0.2 flutter_dotenv: ^5.0.2
accordion: ^2.5.1
flutter_svg: ^1.1.6
pinenacl: ^0.3.3
fast_base58: ^0.2.1
graphql: ^5.1.1
hive_generator: ^2.0.0
dev_dependencies: dev_dependencies:
# flutter_launcher_icons: ^0.9.2 # flutter_launcher_icons: ^0.9.2