From 631dcf7dd777f9bc11b3da32958920b2a20237ff Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 13:49:23 +0200 Subject: [PATCH 01/39] Format code --- src/backgroundFunctions/encryption.ts | 611 ++++++++++++++------------ 1 file changed, 326 insertions(+), 285 deletions(-) diff --git a/src/backgroundFunctions/encryption.ts b/src/backgroundFunctions/encryption.ts index 8c7ec8b..6cc0150 100644 --- a/src/backgroundFunctions/encryption.ts +++ b/src/backgroundFunctions/encryption.ts @@ -1,327 +1,368 @@ -import { getBaseApi } from "../background"; -import { createSymmetricKeyAndNonce, decryptGroupData, encryptDataGroup, objectToBase64 } from "../qdn/encryption/group-encryption"; -import { publishData } from "../qdn/publish/pubish"; -import { getData } from "../utils/chromeStorage"; -import { RequestQueueWithPromise } from "../utils/queue/queue"; - +import { getBaseApi } from '../background'; +import { + createSymmetricKeyAndNonce, + decryptGroupData, + encryptDataGroup, + objectToBase64, +} from '../qdn/encryption/group-encryption'; +import { publishData } from '../qdn/publish/pubish'; +import { getData } from '../utils/chromeStorage'; +import { RequestQueueWithPromise } from '../utils/queue/queue'; export const requestQueueGetPublicKeys = new RequestQueueWithPromise(10); const apiEndpoints = [ - "https://api.qortal.org", - "https://api2.qortal.org", - "https://appnode.qortal.org", - "https://apinode.qortalnodes.live", - "https://apinode1.qortalnodes.live", - "https://apinode2.qortalnodes.live", - "https://apinode3.qortalnodes.live", - "https://apinode4.qortalnodes.live", + 'https://api.qortal.org', + 'https://api2.qortal.org', + 'https://appnode.qortal.org', + 'https://apinode.qortalnodes.live', + 'https://apinode1.qortalnodes.live', + 'https://apinode2.qortalnodes.live', + 'https://apinode3.qortalnodes.live', + 'https://apinode4.qortalnodes.live', ]; async function findUsableApi() { - for (const endpoint of apiEndpoints) { - try { - const response = await fetch(`${endpoint}/admin/status`); - if (!response.ok) throw new Error("Failed to fetch"); - - const data = await response.json(); - if (data.isSynchronizing === false && data.syncPercent === 100) { - console.log(`Usable API found: ${endpoint}`); - return endpoint; - } else { - console.log(`API not ready: ${endpoint}`); - } - } catch (error) { - console.error(`Error checking API ${endpoint}:`, error); + for (const endpoint of apiEndpoints) { + try { + const response = await fetch(`${endpoint}/admin/status`); + if (!response.ok) throw new Error('Failed to fetch'); + + const data = await response.json(); + if (data.isSynchronizing === false && data.syncPercent === 100) { + console.log(`Usable API found: ${endpoint}`); + return endpoint; + } else { + console.log(`API not ready: ${endpoint}`); } + } catch (error) { + console.error(`Error checking API ${endpoint}:`, error); } - - throw new Error("No usable API found"); } + throw new Error('No usable API found'); +} async function getSaveWallet() { - const res = await getData("walletInfo").catch(() => null); + const res = await getData('walletInfo').catch(() => null); - if (res) { - return res - } else { - throw new Error("No wallet saved"); - } - } -export async function getNameInfo() { - const wallet = await getSaveWallet(); - const address = wallet.address0; - const validApi = await getBaseApi() - const response = await fetch(validApi + "/names/address/" + address); - const nameData = await response.json(); - if (nameData?.length > 0) { - return nameData[0].name; - } else { - return ""; - } - } -async function getKeyPair() { - const res = await getData("keyPair").catch(() => null); if (res) { - return res - } else { - throw new Error("Wallet not authenticated"); - } + return res; + } else { + throw new Error('No wallet saved'); } - const getPublicKeys = async (groupNumber: number) => { - const validApi = await getBaseApi(); - const response = await fetch(`${validApi}/groups/members/${groupNumber}?limit=0`); - const groupData = await response.json(); - - if (groupData && Array.isArray(groupData.members)) { - // Use the request queue for fetching public keys - const memberPromises = groupData.members - .filter((member) => member.member) - .map((member) => - requestQueueGetPublicKeys.enqueue(async () => { - const resAddress = await fetch(`${validApi}/addresses/${member.member}`); - const resData = await resAddress.json(); - return resData.publicKey; - }) - ); - - const members = await Promise.all(memberPromises); - return members; - } - - return []; - }; +} - export const getPublicKeysByAddress = async (admins: string[]) => { - const validApi = await getBaseApi(); - - if (Array.isArray(admins)) { - // Use the request queue to limit concurrent fetches - const memberPromises = admins - .filter((address) => address) // Ensure the address is valid - .map((address) => - requestQueueGetPublicKeys.enqueue(async () => { - const resAddress = await fetch(`${validApi}/addresses/${address}`); - const resData = await resAddress.json(); - return resData.publicKey; - }) - ); - - const members = await Promise.all(memberPromises); - return members; - } - - return []; // Return empty array if admins is not an array - }; +export async function getNameInfo() { + const wallet = await getSaveWallet(); + const address = wallet.address0; + const validApi = await getBaseApi(); + const response = await fetch(validApi + '/names/address/' + address); + const nameData = await response.json(); + if (nameData?.length > 0) { + return nameData[0].name; + } else { + return ''; + } +} +async function getKeyPair() { + const res = await getData('keyPair').catch(() => null); + if (res) { + return res; + } else { + throw new Error('Wallet not authenticated'); + } +} +const getPublicKeys = async (groupNumber: number) => { + const validApi = await getBaseApi(); + const response = await fetch( + `${validApi}/groups/members/${groupNumber}?limit=0` + ); + const groupData = await response.json(); - -export const encryptAndPublishSymmetricKeyGroupChat = async ({groupId, previousData}: { - groupId: number, - previousData: Object, -}) => { - try { - - let highestKey = 0 - if(previousData){ - highestKey = Math.max(...Object.keys((previousData || {})).filter(item=> !isNaN(+item)).map(Number)); - - } - - const resKeyPair = await getKeyPair() - const parsedData = resKeyPair - const privateKey = parsedData.privateKey - const userPublicKey = parsedData.publicKey - const groupmemberPublicKeys = await getPublicKeys(groupId) - const symmetricKey = createSymmetricKeyAndNonce() - const nextNumber = highestKey + 1 - const objectToSave = { - ...previousData, - [nextNumber]: symmetricKey - } - - const symmetricKeyAndNonceBase64 = await objectToBase64(objectToSave) - - const encryptedData = encryptDataGroup({ - data64: symmetricKeyAndNonceBase64, - publicKeys: groupmemberPublicKeys, - privateKey, - userPublicKey + if (groupData && Array.isArray(groupData.members)) { + // Use the request queue for fetching public keys + const memberPromises = groupData.members + .filter((member) => member.member) + .map((member) => + requestQueueGetPublicKeys.enqueue(async () => { + const resAddress = await fetch( + `${validApi}/addresses/${member.member}` + ); + const resData = await resAddress.json(); + return resData.publicKey; }) - if(encryptedData){ - const registeredName = await getNameInfo() - const data = await publishData({ - registeredName, file: encryptedData, service: 'DOCUMENT_PRIVATE', identifier: `symmetric-qchat-group-${groupId}`, uploadType: 'file', isBase64: true, withFee: true - }) - return { - data, - numberOfMembers: groupmemberPublicKeys.length - } - - } else { - throw new Error('Cannot encrypt content') - } - } catch (error: any) { - throw new Error(error.message); + ); + + const members = await Promise.all(memberPromises); + return members; + } + + return []; +}; + +export const getPublicKeysByAddress = async (admins: string[]) => { + const validApi = await getBaseApi(); + + if (Array.isArray(admins)) { + // Use the request queue to limit concurrent fetches + const memberPromises = admins + .filter((address) => address) // Ensure the address is valid + .map((address) => + requestQueueGetPublicKeys.enqueue(async () => { + const resAddress = await fetch(`${validApi}/addresses/${address}`); + const resData = await resAddress.json(); + return resData.publicKey; + }) + ); + + const members = await Promise.all(memberPromises); + return members; + } + + return []; // Return empty array if admins is not an array +}; + +export const encryptAndPublishSymmetricKeyGroupChat = async ({ + groupId, + previousData, +}: { + groupId: number; + previousData: Object; +}) => { + try { + let highestKey = 0; + if (previousData) { + highestKey = Math.max( + ...Object.keys(previousData || {}) + .filter((item) => !isNaN(+item)) + .map(Number) + ); } -} -export const encryptAndPublishSymmetricKeyGroupChatForAdmins = async ({groupId, previousData, admins}: { - groupId: number, - previousData: Object, + + const resKeyPair = await getKeyPair(); + const parsedData = resKeyPair; + const privateKey = parsedData.privateKey; + const userPublicKey = parsedData.publicKey; + const groupmemberPublicKeys = await getPublicKeys(groupId); + const symmetricKey = createSymmetricKeyAndNonce(); + const nextNumber = highestKey + 1; + const objectToSave = { + ...previousData, + [nextNumber]: symmetricKey, + }; + + const symmetricKeyAndNonceBase64 = await objectToBase64(objectToSave); + + const encryptedData = encryptDataGroup({ + data64: symmetricKeyAndNonceBase64, + publicKeys: groupmemberPublicKeys, + privateKey, + userPublicKey, + }); + if (encryptedData) { + const registeredName = await getNameInfo(); + const data = await publishData({ + registeredName, + file: encryptedData, + service: 'DOCUMENT_PRIVATE', + identifier: `symmetric-qchat-group-${groupId}`, + uploadType: 'file', + isBase64: true, + withFee: true, + }); + return { + data, + numberOfMembers: groupmemberPublicKeys.length, + }; + } else { + throw new Error('Cannot encrypt content'); + } + } catch (error: any) { + throw new Error(error.message); + } +}; + +export const encryptAndPublishSymmetricKeyGroupChatForAdmins = async ({ + groupId, + previousData, + admins, +}: { + groupId: number; + previousData: Object; }) => { try { - - let highestKey = 0 - if(previousData){ - highestKey = Math.max(...Object.keys((previousData || {})).filter(item=> !isNaN(+item)).map(Number)); - - } - - const resKeyPair = await getKeyPair() - const parsedData = resKeyPair - const privateKey = parsedData.privateKey - const userPublicKey = parsedData.publicKey - const groupmemberPublicKeys = await getPublicKeysByAddress(admins.map((admin)=> admin.address)) + let highestKey = 0; + if (previousData) { + highestKey = Math.max( + ...Object.keys(previousData || {}) + .filter((item) => !isNaN(+item)) + .map(Number) + ); + } - - const symmetricKey = createSymmetricKeyAndNonce() - const nextNumber = highestKey + 1 - const objectToSave = { - ...previousData, - [nextNumber]: symmetricKey - } - - const symmetricKeyAndNonceBase64 = await objectToBase64(objectToSave) - - const encryptedData = encryptDataGroup({ - data64: symmetricKeyAndNonceBase64, - publicKeys: groupmemberPublicKeys, - privateKey, - userPublicKey - }) - if(encryptedData){ - const registeredName = await getNameInfo() - const data = await publishData({ - registeredName, file: encryptedData, service: 'DOCUMENT_PRIVATE', identifier: `admins-symmetric-qchat-group-${groupId}`, uploadType: 'file', isBase64: true, withFee: true - }) - return { - data, - numberOfMembers: groupmemberPublicKeys.length - } - - } else { - throw new Error('Cannot encrypt content') - } + const resKeyPair = await getKeyPair(); + const parsedData = resKeyPair; + const privateKey = parsedData.privateKey; + const userPublicKey = parsedData.publicKey; + const groupmemberPublicKeys = await getPublicKeysByAddress( + admins.map((admin) => admin.address) + ); + + const symmetricKey = createSymmetricKeyAndNonce(); + const nextNumber = highestKey + 1; + const objectToSave = { + ...previousData, + [nextNumber]: symmetricKey, + }; + + const symmetricKeyAndNonceBase64 = await objectToBase64(objectToSave); + + const encryptedData = encryptDataGroup({ + data64: symmetricKeyAndNonceBase64, + publicKeys: groupmemberPublicKeys, + privateKey, + userPublicKey, + }); + if (encryptedData) { + const registeredName = await getNameInfo(); + const data = await publishData({ + registeredName, + file: encryptedData, + service: 'DOCUMENT_PRIVATE', + identifier: `admins-symmetric-qchat-group-${groupId}`, + uploadType: 'file', + isBase64: true, + withFee: true, + }); + return { + data, + numberOfMembers: groupmemberPublicKeys.length, + }; + } else { + throw new Error('Cannot encrypt content'); + } } catch (error: any) { - throw new Error(error.message); + throw new Error(error.message); } -} -export const publishGroupEncryptedResource = async ({encryptedData, identifier}) => { - try { - - if(encryptedData && identifier){ - const registeredName = await getNameInfo() - if(!registeredName) throw new Error('You need a name to publish') - const data = await publishData({ - registeredName, file: encryptedData, service: 'DOCUMENT', identifier, uploadType: 'file', isBase64: true, withFee: true - }) - return data - - } else { - throw new Error('Cannot encrypt content') - } - } catch (error: any) { - throw new Error(error.message); - } -} -export const publishOnQDN = async ({data, identifier, service, title, - description, - category, - tag1, - tag2, - tag3, - tag4, - tag5, - uploadType = 'file' +}; + +export const publishGroupEncryptedResource = async ({ + encryptedData, + identifier, }) => { + try { + if (encryptedData && identifier) { + const registeredName = await getNameInfo(); + if (!registeredName) throw new Error('You need a name to publish'); + const data = await publishData({ + registeredName, + file: encryptedData, + service: 'DOCUMENT', + identifier, + uploadType: 'file', + isBase64: true, + withFee: true, + }); + return data; + } else { + throw new Error('Cannot encrypt content'); + } + } catch (error: any) { + throw new Error(error.message); + } +}; - if(data && service){ - const registeredName = await getNameInfo() - if(!registeredName) throw new Error('You need a name to publish') - - const res = await publishData({ - registeredName, file: data, service, identifier, uploadType, isBase64: true, withFee: true, title, - description, - category, - tag1, - tag2, - tag3, - tag4, - tag5 - - }) - return res +export const publishOnQDN = async ({ + data, + identifier, + service, + title, + description, + category, + tag1, + tag2, + tag3, + tag4, + tag5, + uploadType = 'file', +}) => { + if (data && service) { + const registeredName = await getNameInfo(); + if (!registeredName) throw new Error('You need a name to publish'); - - - } else { - throw new Error('Cannot publish content') - } - -} + const res = await publishData({ + registeredName, + file: data, + service, + identifier, + uploadType, + isBase64: true, + withFee: true, + title, + description, + category, + tag1, + tag2, + tag3, + tag4, + tag5, + }); + return res; + } else { + throw new Error('Cannot publish content'); + } +}; export function uint8ArrayToBase64(uint8Array: any) { - const length = uint8Array.length - let binaryString = '' - const chunkSize = 1024 * 1024; // Process 1MB at a time - for (let i = 0; i < length; i += chunkSize) { - const chunkEnd = Math.min(i + chunkSize, length) - const chunk = uint8Array.subarray(i, chunkEnd) + const length = uint8Array.length; + let binaryString = ''; + const chunkSize = 1024 * 1024; // Process 1MB at a time + for (let i = 0; i < length; i += chunkSize) { + const chunkEnd = Math.min(i + chunkSize, length); + const chunk = uint8Array.subarray(i, chunkEnd); - // @ts-ignore - binaryString += Array.from(chunk, byte => String.fromCharCode(byte)).join('') - } - return btoa(binaryString) + // @ts-ignore + binaryString += Array.from(chunk, (byte) => String.fromCharCode(byte)).join( + '' + ); + } + return btoa(binaryString); } export function base64ToUint8Array(base64: string) { - const binaryString = atob(base64) - const len = binaryString.length - const bytes = new Uint8Array(len) + const binaryString = atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); - for (let i = 0; i < len; i++) { - bytes[i] = binaryString.charCodeAt(i) - } - - return bytes + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); } -export const decryptGroupEncryption = async ({data}: { - data: string -}) => { - try { - const resKeyPair = await getKeyPair() - const parsedData = resKeyPair - const privateKey = parsedData.privateKey - const encryptedData = decryptGroupData( - data, - privateKey, - ) - return { - data: uint8ArrayToBase64(encryptedData.decryptedData), - count: encryptedData.count - } - } catch (error: any) { - throw new Error(error.message); - } + return bytes; } +export const decryptGroupEncryption = async ({ data }: { data: string }) => { + try { + const resKeyPair = await getKeyPair(); + const parsedData = resKeyPair; + const privateKey = parsedData.privateKey; + const encryptedData = decryptGroupData(data, privateKey); + return { + data: uint8ArrayToBase64(encryptedData.decryptedData), + count: encryptedData.count, + }; + } catch (error: any) { + throw new Error(error.message); + } +}; + export function uint8ArrayToObject(uint8Array: any) { - // Decode the byte array using TextDecoder - const decoder = new TextDecoder() - const jsonString = decoder.decode(uint8Array) - // Convert the JSON string back into an object - return JSON.parse(jsonString) -} \ No newline at end of file + // Decode the byte array using TextDecoder + const decoder = new TextDecoder(); + const jsonString = decoder.decode(uint8Array); + // Convert the JSON string back into an object + return JSON.parse(jsonString); +} From bf4e58bcfae1bd6a5d3be45eaf81a35d41f69f18 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 13:49:42 +0200 Subject: [PATCH 02/39] Remove files for mobile --- src/components/Apps/Apps.tsx | 357 ----------------- src/components/Apps/AppsCategory.tsx | 193 --------- src/components/Apps/AppsHome.tsx | 56 --- src/components/Apps/AppsLibrary.tsx | 384 ------------------ src/components/Apps/AppsNavBar.tsx | 367 ----------------- src/components/Mobile/MobileFooter.tsx | 203 ---------- src/components/Mobile/MobileHeader.tsx | 528 ------------------------- 7 files changed, 2088 deletions(-) delete mode 100644 src/components/Apps/Apps.tsx delete mode 100644 src/components/Apps/AppsCategory.tsx delete mode 100644 src/components/Apps/AppsHome.tsx delete mode 100644 src/components/Apps/AppsLibrary.tsx delete mode 100644 src/components/Apps/AppsNavBar.tsx delete mode 100644 src/components/Mobile/MobileFooter.tsx delete mode 100644 src/components/Mobile/MobileHeader.tsx diff --git a/src/components/Apps/Apps.tsx b/src/components/Apps/Apps.tsx deleted file mode 100644 index b4e6f67..0000000 --- a/src/components/Apps/Apps.tsx +++ /dev/null @@ -1,357 +0,0 @@ -import React, { useEffect, useMemo, useRef, useState } from 'react'; -import { AppsHome } from './AppsHome'; -import { Spacer } from '../../common/Spacer'; -import { getBaseApiReact } from '../../App'; -import { AppInfo } from './AppInfo'; -import { - executeEvent, - subscribeToEvent, - unsubscribeFromEvent, -} from '../../utils/events'; -import { AppsParent } from './Apps-styles'; -import AppViewerContainer from './AppViewerContainer'; -import ShortUniqueId from 'short-unique-id'; -import { AppPublish } from './AppPublish'; -import { AppsCategory } from './AppsCategory'; -import { AppsLibrary } from './AppsLibrary'; - -const uid = new ShortUniqueId({ length: 8 }); - -export const Apps = ({ mode, setMode, show, myName }) => { - const [availableQapps, setAvailableQapps] = useState([]); - const [selectedAppInfo, setSelectedAppInfo] = useState(null); - const [selectedCategory, setSelectedCategory] = useState(null); - const [tabs, setTabs] = useState([]); - const [selectedTab, setSelectedTab] = useState(null); - const [isNewTabWindow, setIsNewTabWindow] = useState(false); - const [categories, setCategories] = useState([]); - const iframeRefs = useRef({}); - - const myApp = useMemo(() => { - return availableQapps.find( - (app) => app.name === myName && app.service === 'APP' - ); - }, [myName, availableQapps]); - - const myWebsite = useMemo(() => { - return availableQapps.find( - (app) => app.name === myName && app.service === 'WEBSITE' - ); - }, [myName, availableQapps]); - - useEffect(() => { - setTimeout(() => { - executeEvent('setTabsToNav', { - data: { - tabs: tabs, - selectedTab: selectedTab, - isNewTabWindow: isNewTabWindow, - }, - }); - }, 100); - }, [show, tabs, selectedTab, isNewTabWindow]); - - const getCategories = React.useCallback(async () => { - try { - const url = `${getBaseApiReact()}/arbitrary/categories`; - - const response = await fetch(url, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); - if (!response?.ok) return; - const responseData = await response.json(); - - setCategories(responseData); - } catch (error) { - console.log(error); - } finally { - // dispatch(setIsLoadingGlobal(false)) - } - }, []); - - const getQapps = React.useCallback(async () => { - try { - let apps = []; - let websites = []; - // dispatch(setIsLoadingGlobal(true)) - const url = `${getBaseApiReact()}/arbitrary/resources/search?service=APP&mode=ALL&limit=0&includestatus=true&includemetadata=true`; - - const response = await fetch(url, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); - if (!response?.ok) return; - const responseData = await response.json(); - const urlWebsites = `${getBaseApiReact()}/arbitrary/resources/search?service=WEBSITE&mode=ALL&limit=0&includestatus=true&includemetadata=true`; - - const responseWebsites = await fetch(urlWebsites, { - method: 'GET', - headers: { - 'Content-Type': 'application/json', - }, - }); - if (!responseWebsites?.ok) return; - const responseDataWebsites = await responseWebsites.json(); - - apps = responseData; - websites = responseDataWebsites; - const combine = [...apps, ...websites]; - setAvailableQapps(combine); - } catch (error) { - console.log(error); - } finally { - // dispatch(setIsLoadingGlobal(false)) - } - }, []); - useEffect(() => { - getQapps(); - getCategories(); - }, [getQapps, getCategories]); - - const selectedAppInfoFunc = (e) => { - const data = e.detail?.data; - setSelectedAppInfo(data); - setMode('appInfo'); - }; - - useEffect(() => { - subscribeToEvent('selectedAppInfo', selectedAppInfoFunc); - - return () => { - unsubscribeFromEvent('selectedAppInfo', selectedAppInfoFunc); - }; - }, []); - - const selectedAppInfoCategoryFunc = (e) => { - const data = e.detail?.data; - setSelectedAppInfo(data); - setMode('appInfo-from-category'); - }; - - useEffect(() => { - subscribeToEvent('selectedAppInfoCategory', selectedAppInfoCategoryFunc); - - return () => { - unsubscribeFromEvent( - 'selectedAppInfoCategory', - selectedAppInfoCategoryFunc - ); - }; - }, []); - - const selectedCategoryFunc = (e) => { - const data = e.detail?.data; - setSelectedCategory(data); - setMode('category'); - }; - - useEffect(() => { - subscribeToEvent('selectedCategory', selectedCategoryFunc); - - return () => { - unsubscribeFromEvent('selectedCategory', selectedCategoryFunc); - }; - }, []); - - const navigateBackFunc = (e) => { - if ( - [ - 'category', - 'appInfo-from-category', - 'appInfo', - 'library', - 'publish', - ].includes(mode) - ) { - // Handle the various modes as needed - if (mode === 'category') { - setMode('library'); - setSelectedCategory(null); - } else if (mode === 'appInfo-from-category') { - setMode('category'); - } else if (mode === 'appInfo') { - setMode('library'); - } else if (mode === 'library') { - if (isNewTabWindow) { - setMode('viewer'); - } else { - setMode('home'); - } - } else if (mode === 'publish') { - setMode('library'); - } - } else if (selectedTab?.tabId) { - executeEvent(`navigateBackApp-${selectedTab?.tabId}`, {}); - } - }; - - useEffect(() => { - subscribeToEvent('navigateBack', navigateBackFunc); - - return () => { - unsubscribeFromEvent('navigateBack', navigateBackFunc); - }; - }, [mode, selectedTab]); - - const addTabFunc = (e) => { - const data = e.detail?.data; - const newTab = { - ...data, - tabId: uid.rnd(), - }; - setTabs((prev) => [...prev, newTab]); - setSelectedTab(newTab); - setMode('viewer'); - - setIsNewTabWindow(false); - }; - - useEffect(() => { - subscribeToEvent('addTab', addTabFunc); - - return () => { - unsubscribeFromEvent('addTab', addTabFunc); - }; - }, [tabs]); - - const setSelectedTabFunc = (e) => { - const data = e.detail?.data; - - setSelectedTab(data); - setTimeout(() => { - executeEvent('setTabsToNav', { - data: { - tabs: tabs, - selectedTab: data, - isNewTabWindow: isNewTabWindow, - }, - }); - }, 100); - setIsNewTabWindow(false); - }; - - useEffect(() => { - subscribeToEvent('setSelectedTab', setSelectedTabFunc); - - return () => { - unsubscribeFromEvent('setSelectedTab', setSelectedTabFunc); - }; - }, [tabs, isNewTabWindow]); - - const removeTabFunc = (e) => { - const data = e.detail?.data; - const copyTabs = [...tabs].filter((tab) => tab?.tabId !== data?.tabId); - if (copyTabs?.length === 0) { - setMode('home'); - } else { - setSelectedTab(copyTabs[0]); - } - setTabs(copyTabs); - setSelectedTab(copyTabs[0]); - setTimeout(() => { - executeEvent('setTabsToNav', { - data: { - tabs: copyTabs, - selectedTab: copyTabs[0], - }, - }); - }, 400); - }; - - useEffect(() => { - subscribeToEvent('removeTab', removeTabFunc); - - return () => { - unsubscribeFromEvent('removeTab', removeTabFunc); - }; - }, [tabs]); - - const setNewTabWindowFunc = (e) => { - setIsNewTabWindow(true); - setSelectedTab(null); - }; - - useEffect(() => { - subscribeToEvent('newTabWindow', setNewTabWindowFunc); - - return () => { - unsubscribeFromEvent('newTabWindow', setNewTabWindowFunc); - }; - }, [tabs]); - - return ( - - {mode !== 'viewer' && !selectedTab && } - {mode === 'home' && ( - - )} - - - - {mode === 'appInfo' && !selectedTab && ( - - )} - {mode === 'appInfo-from-category' && !selectedTab && ( - - )} - - {mode === 'publish' && !selectedTab && ( - - )} - - {tabs.map((tab) => { - if (!iframeRefs.current[tab.tabId]) { - iframeRefs.current[tab.tabId] = React.createRef(); - } - return ( - - ); - })} - - {isNewTabWindow && mode === 'viewer' && ( - <> - - - - )} - {mode !== 'viewer' && !selectedTab && } - - ); -}; diff --git a/src/components/Apps/AppsCategory.tsx b/src/components/Apps/AppsCategory.tsx deleted file mode 100644 index 4871026..0000000 --- a/src/components/Apps/AppsCategory.tsx +++ /dev/null @@ -1,193 +0,0 @@ -import React, { useCallback, useContext, useEffect, useMemo, useRef, useState } from "react"; -import { - AppCircle, - AppCircleContainer, - AppCircleLabel, - AppLibrarySubTitle, - AppsContainer, - AppsLibraryContainer, - AppsParent, - AppsSearchContainer, - AppsSearchLeft, - AppsSearchRight, - AppsWidthLimiter, - PublishQAppCTAButton, - PublishQAppCTALeft, - PublishQAppCTAParent, - PublishQAppCTARight, - PublishQAppDotsBG, -} from "./Apps-styles"; -import { Avatar, Box, ButtonBase, InputBase, styled } from "@mui/material"; -import { Add } from "@mui/icons-material"; -import { MyContext, getBaseApiReact } from "../../App"; -import LogoSelected from "../../assets/svgs/LogoSelected.svg"; -import IconSearch from "../../assets/svgs/Search.svg"; -import IconClearInput from "../../assets/svgs/ClearInput.svg"; -import qappDevelopText from "../../assets/svgs/qappDevelopText.svg"; -import qappDots from "../../assets/svgs/qappDots.svg"; - -import { Spacer } from "../../common/Spacer"; -import { AppInfoSnippet } from "./AppInfoSnippet"; -import { Virtuoso } from "react-virtuoso"; -import { executeEvent } from "../../utils/events"; -const officialAppList = [ - "q-tube", - "q-blog", - "q-share", - "q-support", - "q-mail", - "q-fund", - "q-shop", - "q-trade", - "q-support", - "q-manager", - "q-wallets", - "q-search", - "q-nodecontrol" -]; - -const ScrollerStyled = styled('div')({ - // Hide scrollbar for WebKit browsers (Chrome, Safari) - "::-webkit-scrollbar": { - width: "0px", - height: "0px", - }, - - // Hide scrollbar for Firefox - scrollbarWidth: "none", - - // Hide scrollbar for IE and older Edge - "-msOverflowStyle": "none", - }); - - const StyledVirtuosoContainer = styled('div')({ - position: 'relative', - width: '100%', - display: 'flex', - flexDirection: 'column', - - // Hide scrollbar for WebKit browsers (Chrome, Safari) - "::-webkit-scrollbar": { - width: "0px", - height: "0px", - }, - - // Hide scrollbar for Firefox - scrollbarWidth: "none", - - // Hide scrollbar for IE and older Edge - "-msOverflowStyle": "none", - }); - -export const AppsCategory = ({ availableQapps, myName, category, isShow }) => { - const [searchValue, setSearchValue] = useState(""); - const virtuosoRef = useRef(); - const { rootHeight } = useContext(MyContext); - - - - const categoryList = useMemo(() => { - return availableQapps.filter( - (app) => - app?.metadata?.category === category?.id - ); - }, [availableQapps, category]); - - const [debouncedValue, setDebouncedValue] = useState(""); // Debounced value - - // Debounce logic - useEffect(() => { - const handler = setTimeout(() => { - setDebouncedValue(searchValue); - }, 350); - - // Cleanup timeout if searchValue changes before the timeout completes - return () => { - clearTimeout(handler); - }; - }, [searchValue]); // Runs effect when searchValue changes - - // Example: Perform search or other actions based on debouncedValue - - const searchedList = useMemo(() => { - if (!debouncedValue) return categoryList - return categoryList.filter((app) => - app.name.toLowerCase().includes(debouncedValue.toLowerCase()) - ); - }, [debouncedValue, categoryList]); - - const rowRenderer = (index) => { - - let app = searchedList[index]; - return ; - }; - - - - return ( - - - - - - - setSearchValue(e.target.value)} - sx={{ ml: 1, flex: 1 }} - placeholder="Search for apps" - inputProps={{ - "aria-label": "Search for apps", - fontSize: "16px", - fontWeight: 400, - }} - /> - - - {searchValue && ( - { - setSearchValue(""); - }} - > - - - )} - - - - - - - {`Category: ${category?.name}`} - - - - - - - - - - - ); -}; diff --git a/src/components/Apps/AppsHome.tsx b/src/components/Apps/AppsHome.tsx deleted file mode 100644 index 4b5b030..0000000 --- a/src/components/Apps/AppsHome.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import React, { useMemo, useState } from 'react'; -import { - AppCircle, - AppCircleContainer, - AppCircleLabel, - AppLibrarySubTitle, - AppsContainer, - AppsParent, -} from './Apps-styles'; -import { Avatar, ButtonBase } from '@mui/material'; -import { Add } from '@mui/icons-material'; -import { getBaseApiReact, isMobile } from '../../App'; -import LogoSelected from '../../assets/svgs/LogoSelected.svg'; -import { executeEvent } from '../../utils/events'; -import { SortablePinnedApps } from './SortablePinnedApps'; -import { Spacer } from '../../common/Spacer'; - -export const AppsHome = ({ setMode, myApp, myWebsite, availableQapps }) => { - return ( - <> - - Apps Dashboard - - - - - { - setMode('library'); - }} - > - - - + - - Library - - - - - - - ); -}; diff --git a/src/components/Apps/AppsLibrary.tsx b/src/components/Apps/AppsLibrary.tsx deleted file mode 100644 index e5cac4a..0000000 --- a/src/components/Apps/AppsLibrary.tsx +++ /dev/null @@ -1,384 +0,0 @@ -import { useContext, useEffect, useMemo, useRef, useState } from 'react'; -import { - AppCircle, - AppCircleContainer, - AppCircleLabel, - AppLibrarySubTitle, - AppsContainer, - AppsLibraryContainer, - AppsSearchContainer, - AppsSearchLeft, - AppsSearchRight, - AppsWidthLimiter, - PublishQAppCTAButton, - PublishQAppCTALeft, - PublishQAppCTAParent, - PublishQAppCTARight, - PublishQAppDotsBG, -} from './Apps-styles'; -import { - Avatar, - Box, - ButtonBase, - InputBase, - styled, - useTheme, -} from '@mui/material'; -import { MyContext, getBaseApiReact } from '../../App'; -import LogoSelected from '../../assets/svgs/LogoSelected.svg'; -import IconSearch from '../../assets/svgs/Search.svg'; -import IconClearInput from '../../assets/svgs/ClearInput.svg'; -import qappDevelopText from '../../assets/svgs/qappDevelopText.svg'; -import qappDots from '../../assets/svgs/qappDots.svg'; -// import { Return } from './assets/svgs/Return.tsx'; -import ReturnSVG from '../../assets/svgs/Return.svg'; -import { Spacer } from '../../common/Spacer'; -import { AppInfoSnippet } from './AppInfoSnippet'; -import { Virtuoso } from 'react-virtuoso'; -import { executeEvent } from '../../utils/events'; -import { - ComposeP, - MailIconImg, - ShowMessageReturnButton, -} from '../Group/Forum/Mail-styles'; - -const officialAppList = [ - 'q-tube', - 'q-blog', - 'q-share', - 'q-support', - 'q-mail', - 'q-fund', - 'q-shop', - 'q-trade', - 'q-support', - 'q-manager', - 'q-wallets', - 'q-search', - 'q-nodecontrol', -]; - -const ScrollerStyled = styled('div')({ - // Hide scrollbar for WebKit browsers (Chrome, Safari) - '::-webkit-scrollbar': { - width: '0px', - height: '0px', - }, - - // Hide scrollbar for Firefox - scrollbarWidth: 'none', - - // Hide scrollbar for IE and older Edge - '-msOverflowStyle': 'none', -}); - -const StyledVirtuosoContainer = styled('div')({ - display: 'flex', - flexDirection: 'column', - position: 'relative', - width: '100%', - - // Hide scrollbar for WebKit browsers (Chrome, Safari) - '::-webkit-scrollbar': { - width: '0px', - height: '0px', - }, - - // Hide scrollbar for Firefox - scrollbarWidth: 'none', - - // Hide scrollbar for IE and older Edge - '-msOverflowStyle': 'none', -}); - -export const AppsLibrary = ({ - availableQapps, - setMode, - myName, - hasPublishApp, - isShow, - categories = { categories }, -}) => { - const [searchValue, setSearchValue] = useState(''); - const virtuosoRef = useRef(); - const { rootHeight } = useContext(MyContext); - - const officialApps = useMemo(() => { - return availableQapps.filter( - (app) => - app.service === 'APP' && - officialAppList.includes(app?.name?.toLowerCase()) - ); - }, [availableQapps]); - - const [debouncedValue, setDebouncedValue] = useState(''); // Debounced value - - // Debounce logic - useEffect(() => { - const handler = setTimeout(() => { - setDebouncedValue(searchValue); - }, 350); - - // Cleanup timeout if searchValue changes before the timeout completes - return () => { - clearTimeout(handler); - }; - }, [searchValue]); // Runs effect when searchValue changes - - // Example: Perform search or other actions based on debouncedValue - - const searchedList = useMemo(() => { - if (!debouncedValue) return []; - return availableQapps.filter((app) => - app.name.toLowerCase().includes(debouncedValue.toLowerCase()) - ); - }, [debouncedValue]); - - const rowRenderer = (index) => { - let app = searchedList[index]; - return ( - - ); - }; - - const theme = useTheme(); - - return ( - - - - - - - - setSearchValue(e.target.value)} - sx={{ ml: 1, flex: 1 }} - placeholder="Search for apps" - inputProps={{ - 'aria-label': 'Search for apps', - fontSize: '16px', - fontWeight: 400, - }} - /> - - - {searchValue && ( - { - setSearchValue(''); - }} - > - - - )} - - - - - - - - { - executeEvent('navigateBack', {}); - }} - > - // TODO return icon - Return to Apps Dashboard - - - - - {searchedList?.length > 0 ? ( - - - - - - ) : ( - <> - - Official Apps - - - - - {officialApps?.map((qapp) => { - return ( - { - // executeEvent("addTab", { - // data: qapp - // }) - executeEvent('selectedAppInfo', { - data: qapp, - }); - }} - > - - - - center-icon - - - - - {qapp?.metadata?.title || qapp?.name} - - - - ); - })} - - - - - - {hasPublishApp ? 'Update Apps!' : 'Create Apps!'} - - - - - - - - - - - - - - - - - { - setMode('publish'); - }} - > - - {hasPublishApp ? 'Update' : 'Publish'} - - - - - - - - - - Categories - - - - - {categories?.map((category) => { - return ( - { - executeEvent('selectedCategory', { - data: category, - }); - }} - > - - {category?.name} - - - ); - })} - - - - )} - - ); -}; diff --git a/src/components/Apps/AppsNavBar.tsx b/src/components/Apps/AppsNavBar.tsx deleted file mode 100644 index 9731bd5..0000000 --- a/src/components/Apps/AppsNavBar.tsx +++ /dev/null @@ -1,367 +0,0 @@ -import { useEffect, useMemo, useRef, useState } from 'react'; -import { - AppsNavBarLeft, - AppsNavBarParent, - AppsNavBarRight, -} from './Apps-styles'; -import { NavBack } from '../../assets/Icons/NavBack.tsx'; -import { NavAdd } from '../../assets/Icons/NavAdd.tsx'; -import { NavMoreMenu } from '../../assets/Icons/NavMoreMenu.tsx'; -import { - ButtonBase, - ListItemIcon, - ListItemText, - Menu, - MenuItem, - Tab, - Tabs, -} from '@mui/material'; -import { - executeEvent, - subscribeToEvent, - unsubscribeFromEvent, -} from '../../utils/events'; -import TabComponent from './TabComponent'; -import PushPinIcon from '@mui/icons-material/PushPin'; -import RefreshIcon from '@mui/icons-material/Refresh'; -import { useRecoilState, useSetRecoilState } from 'recoil'; -import { - navigationControllerAtom, - settingsLocalLastUpdatedAtom, - sortablePinnedAppsAtom, -} from '../../atoms/global'; - -export function saveToLocalStorage( - key, - subKey, - newValue, - otherRootData = {}, - deleteWholeKey -) { - try { - if (deleteWholeKey) { - localStorage.setItem(key, null); - return; - } - // Fetch existing data - const existingData = localStorage.getItem(key); - let combinedData = {}; - - if (existingData) { - // Parse the existing data - const parsedData = JSON.parse(existingData); - // Merge with the new data under the subKey - combinedData = { - ...parsedData, - ...otherRootData, - timestamp: Date.now(), // Update the root timestamp - [subKey]: newValue, // Assuming the data is an array - }; - } else { - // If no existing data, just use the new data under the subKey - combinedData = { - ...otherRootData, - timestamp: Date.now(), // Set the initial root timestamp - [subKey]: newValue, - }; - } - - // Save combined data back to localStorage - const serializedValue = JSON.stringify(combinedData); - localStorage.setItem(key, serializedValue); - } catch (error) { - console.error('Error saving to localStorage:', error); - } -} - -export const AppsNavBar = () => { - const [tabs, setTabs] = useState([]); - const [selectedTab, setSelectedTab] = useState(null); - const [isNewTabWindow, setIsNewTabWindow] = useState(false); - const tabsRef = useRef(null); - const [anchorEl, setAnchorEl] = useState(null); - const open = Boolean(anchorEl); - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( - sortablePinnedAppsAtom - ); - const [navigationController, setNavigationController] = useRecoilState( - navigationControllerAtom - ); - - const isDisableBackButton = useMemo(() => { - if (selectedTab && navigationController[selectedTab?.tabId]?.hasBack) - return false; - if (selectedTab && !navigationController[selectedTab?.tabId]?.hasBack) - return true; - return false; - }, [navigationController, selectedTab]); - - const setSettingsLocalLastUpdated = useSetRecoilState( - settingsLocalLastUpdatedAtom - ); - - const handleClick = (event) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; - - useEffect(() => { - // Scroll to the last tab whenever the tabs array changes (e.g., when a new tab is added) - if (tabsRef.current) { - const tabElements = tabsRef.current.querySelectorAll('.MuiTab-root'); - if (tabElements.length > 0) { - const lastTab = tabElements[tabElements.length - 1]; - lastTab.scrollIntoView({ - behavior: 'smooth', - block: 'nearest', - inline: 'end', - }); - } - } - }, [tabs.length]); // Dependency on the number of tabs - - const setTabsToNav = (e) => { - const { tabs, selectedTab, isNewTabWindow } = e.detail?.data; - - setTabs([...tabs]); - setSelectedTab(!selectedTab ? null : { ...selectedTab }); - setIsNewTabWindow(isNewTabWindow); - }; - - useEffect(() => { - subscribeToEvent('setTabsToNav', setTabsToNav); - - return () => { - unsubscribeFromEvent('setTabsToNav', setTabsToNav); - }; - }, []); - - const isSelectedAppPinned = !!sortablePinnedApps?.find( - (item) => - item?.name === selectedTab?.name && item?.service === selectedTab?.service - ); - return ( - - - { - executeEvent('navigateBack', selectedTab?.tabId); - }} - disabled={isDisableBackButton} - sx={{ - opacity: !isDisableBackButton ? 1 : 0.3, - cursor: !isDisableBackButton ? 'pointer' : 'default', - }} - > - - - - - {tabs?.map((tab) => ( - - } // Pass custom component - sx={{ - '&.Mui-selected': { - color: 'white', - }, - padding: '0px', - margin: '0px', - minWidth: '0px', - width: '50px', - }} - /> - ))} - - - - {selectedTab && ( - - { - setSelectedTab(null); - executeEvent('newTabWindow', {}); - }} - > - - - - { - if (!selectedTab) return; - handleClick(e); - }} - > - - - - )} - - - { - if (!selectedTab) return; - - setSortablePinnedApps((prev) => { - let updatedApps; - - if (isSelectedAppPinned) { - // Remove the selected app if it is pinned - updatedApps = prev.filter( - (item) => - !( - item?.name === selectedTab?.name && - item?.service === selectedTab?.service - ) - ); - } else { - // Add the selected app if it is not pinned - updatedApps = [ - ...prev, - { - name: selectedTab?.name, - service: selectedTab?.service, - }, - ]; - } - - saveToLocalStorage( - 'ext_saved_settings', - 'sortablePinnedApps', - updatedApps - ); - return updatedApps; - }); - setSettingsLocalLastUpdated(Date.now()); - - handleClose(); - }} - > - - - - - - - - { - executeEvent('refreshApp', { - tabId: selectedTab?.tabId, - }); - handleClose(); - }} - > - - - - - - - - - ); -}; diff --git a/src/components/Mobile/MobileFooter.tsx b/src/components/Mobile/MobileFooter.tsx deleted file mode 100644 index 52e5c7c..0000000 --- a/src/components/Mobile/MobileFooter.tsx +++ /dev/null @@ -1,203 +0,0 @@ -import * as React from "react"; -import { - BottomNavigation, - BottomNavigationAction, - ButtonBase, - Typography, -} from "@mui/material"; -import { Home, Groups, Message, ShowChart } from "@mui/icons-material"; -import Box from "@mui/material/Box"; -import BottomLogo from "../../assets/svgs/BottomLogo5.svg"; -import LogoSelected from "../../assets/svgs/LogoSelected.svg"; -import { Browser } from '@capacitor/browser'; - -import { CustomSvg } from "../../common/CustomSvg"; -import { WalletIcon } from "../../assets/Icons/WalletIcon"; -import { HubsIcon } from "../../assets/Icons/HubsIcon"; -import { TradingIcon } from "../../assets/Icons/TradingIcon"; -import { MessagingIcon } from "../../assets/Icons/MessagingIcon"; -import { executeEvent } from "../../utils/events"; - -const IconWrapper = ({ children, label, color }) => { - return ( - - {children} - - {label} - - - ); -}; - -export const MobileFooter = ({ - selectedGroup, - groupSection, - isUnread, - goToAnnouncements, - isUnreadChat, - goToChat, - goToThreads, - setOpenManageMembers, - groupChatHasUnread, - groupsAnnHasUnread, - directChatHasUnread, - chatMode, - openDrawerGroups, - goToHome, - setIsOpenDrawerProfile, - mobileViewMode, - setMobileViewMode, - setMobileViewModeKeepOpen, - hasUnreadGroups, - hasUnreadDirects -}) => { - const [value, setValue] = React.useState(0); - return ( - - setValue(newValue)} - sx={{ backgroundColor: "transparent", flexGrow: 1 }} - > - { - // setMobileViewMode('wallet') - setIsOpenDrawerProfile(true); - }} - icon={ - - - - } - sx={{ color: value === 0 ? "white" : "gray", padding: "0px 10px" }} - /> - { - setMobileViewMode("groups"); - }} - icon={ - - - - } - sx={{ - color: value === 0 ? "white" : "gray", - paddingLeft: "10px", - paddingRight: "42px", - }} - /> - - - {/* Floating Center Button */} - - { - if(mobileViewMode === 'home'){ - setMobileViewMode('apps') - - } else { - setMobileViewMode('home') - - } - }}> - - {/* Custom Center Icon */} - center-icon - - - - - setValue(newValue)} - sx={{ backgroundColor: "transparent", flexGrow: 1 }} - > - { - setMobileViewModeKeepOpen("messaging"); - }} - icon={ - - - - } - sx={{ - color: value === 2 ? "white" : "gray", - paddingLeft: "55px", - paddingRight: "10px", - }} - /> - { - executeEvent("addTab", { data: { service: 'APP', name: 'q-trade' } }); - executeEvent("open-apps-mode", { }); - }} - - icon={ - - - - } - sx={{ color: value === 3 ? "white" : "gray", padding: "0px 10px" }} - /> - - - ); -}; diff --git a/src/components/Mobile/MobileHeader.tsx b/src/components/Mobile/MobileHeader.tsx deleted file mode 100644 index 1ab74dc..0000000 --- a/src/components/Mobile/MobileHeader.tsx +++ /dev/null @@ -1,528 +0,0 @@ -import React, { useState } from "react"; -import { - AppBar, - Toolbar, - IconButton, - Typography, - Box, - MenuItem, - Select, - ButtonBase, - Menu, - ListItemIcon, - ListItemText, -} from "@mui/material"; -import { HomeIcon } from "../../assets/Icons/HomeIcon"; -import { LogoutIcon } from "../../assets/Icons/LogoutIcon"; -import { NotificationIcon } from "../../assets/Icons/NotificationIcon"; -import { ArrowDownIcon } from "../../assets/Icons/ArrowDownIcon"; -import { MessagingIcon } from "../../assets/Icons/MessagingIcon"; -import { MessagingIcon2 } from "../../assets/Icons/MessagingIcon2"; -import { HubsIcon } from "../../assets/Icons/HubsIcon"; -import { Save } from "../Save/Save"; -import CloseFullscreenIcon from "@mui/icons-material/CloseFullscreen"; -import { useRecoilState } from "recoil"; -import { fullScreenAtom, hasSettingsChangedAtom } from "../../atoms/global"; -import { useAppFullScreen } from "../../useAppFullscreen"; - -const Header = ({ - logoutFunc, - goToHome, - setIsOpenDrawerProfile, - isThin, - setMobileViewModeKeepOpen, - hasUnreadGroups, - hasUnreadDirects, - setMobileViewMode, - myName, - setSelectedDirect, - setNewChat, -}) => { - const [anchorEl, setAnchorEl] = useState(null); - const open = Boolean(anchorEl); - const [fullScreen, setFullScreen] = useRecoilState(fullScreenAtom); - const { exitFullScreen } = useAppFullScreen(setFullScreen); - const handleClick = (event) => { - setAnchorEl(event.currentTarget); - }; - - const handleClose = () => { - setAnchorEl(null); - }; - - if (isThin) { - return ( - - - {/* Left Home Icon */} - - { - setMobileViewModeKeepOpen(""); - goToHome(); - }} - // onClick={onHomeClick} - > - - - - - - {fullScreen && ( - { - exitFullScreen(); - setFullScreen(false); - }} - > - - - )} - - - {/* Center Title */} - - QORTAL - - - {/* Right Logout Icon */} - - { - setMobileViewModeKeepOpen("messaging"); - }} - > - - - - - - - - - - { - setSelectedDirect(null); - setNewChat(false); - setMobileViewMode("groups"); - setMobileViewModeKeepOpen(""); - handleClose(); - }} - > - - - - - - { - setMobileViewModeKeepOpen("messaging"); - - handleClose(); - }} - > - - - - - - - - ); - } - return ( - <> - {/* Main Header */} - - - {/* Left Home Icon */} - - - - - {fullScreen && ( - { - exitFullScreen(); - setFullScreen(false); - }} - > - - - )} - - {/* Center Title */} - - QORTAL - - - {/* Right Logout Icon */} - - - - - - - - - {/* Secondary Section */} - - - - {myName} - - {/* - */} - - - - - - - - - {/* Right Dropdown */} - {/* { - setIsOpenDrawerProfile(true); - }} - > - - - View Wallet - - - - - */} - - - - { - setMobileViewMode("groups"); - setMobileViewModeKeepOpen(""); - handleClose(); - }} - > - - - - - - - { - setMobileViewModeKeepOpen("messaging"); - - handleClose(); - }} - > - - - - - - - - ); -}; - -export default Header; From c4f7d150de5056803ad12fde5a533d9a69b799b3 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 13:53:57 +0200 Subject: [PATCH 03/39] Use desktop file --- src/components/Apps/AppInfo.tsx | 350 +++++++++--------- src/components/Apps/AppInfoSnippet.tsx | 292 ++++++++------- src/components/Apps/SortablePinnedApps.tsx | 2 +- src/components/ContextMenuPinnedApps.tsx | 300 ++++++++------- src/components/Save/Save.tsx | 2 +- .../Tutorials/useHandleTutorials.tsx | 334 ++++++++--------- 6 files changed, 682 insertions(+), 598 deletions(-) diff --git a/src/components/Apps/AppInfo.tsx b/src/components/Apps/AppInfo.tsx index ad36163..b1254d5 100644 --- a/src/components/Apps/AppInfo.tsx +++ b/src/components/Apps/AppInfo.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useMemo, useState } from "react"; +import React, { useEffect, useMemo, useState } from 'react'; import { AppCircle, AppCircleContainer, @@ -19,191 +19,211 @@ import { AppsLibraryContainer, AppsParent, AppsWidthLimiter, -} from "./Apps-styles"; -import { Avatar, Box, ButtonBase, InputBase } from "@mui/material"; -import { Add } from "@mui/icons-material"; -import { getBaseApiReact, isMobile } from "../../App"; -import LogoSelected from "../../assets/svgs/LogoSelected.svg"; +} from './Apps-styles'; +import { Avatar, Box, ButtonBase, InputBase } from '@mui/material'; +import { Add } from '@mui/icons-material'; +import { getBaseApiReact, isMobile } from '../../App'; +import LogoSelected from '../../assets/svgs/LogoSelected.svg'; -import { Spacer } from "../../common/Spacer"; -import { executeEvent } from "../../utils/events"; -import { AppRating } from "./AppRating"; -import { settingsLocalLastUpdatedAtom, sortablePinnedAppsAtom } from "../../atoms/global"; -import { saveToLocalStorage } from "./AppsNavBar"; -import { useRecoilState, useSetRecoilState } from "recoil"; +import { Spacer } from '../../common/Spacer'; +import { executeEvent } from '../../utils/events'; +import { AppRating } from './AppRating'; +import { + settingsLocalLastUpdatedAtom, + sortablePinnedAppsAtom, +} from '../../atoms/global'; +import { saveToLocalStorage } from './AppsNavBarDesktop'; +import { useRecoilState, useSetRecoilState } from 'recoil'; export const AppInfo = ({ app, myName }) => { - const isInstalled = app?.status?.status === "READY"; - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState(sortablePinnedAppsAtom); + const isInstalled = app?.status?.status === 'READY'; + const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( + sortablePinnedAppsAtom + ); - const isSelectedAppPinned = !!sortablePinnedApps?.find((item)=> item?.name === app?.name && item?.service === app?.service) - const setSettingsLocalLastUpdated = useSetRecoilState(settingsLocalLastUpdatedAtom); + const isSelectedAppPinned = !!sortablePinnedApps?.find( + (item) => item?.name === app?.name && item?.service === app?.service + ); + const setSettingsLocalLastUpdated = useSetRecoilState( + settingsLocalLastUpdatedAtom + ); return ( - - - - {!isMobile && } - - - - + {!isMobile && } + + + - - - center-icon - - - - - - {app?.metadata?.title || app?.name} - - - {app?.name} - - - - - - - - { - setSortablePinnedApps((prev) => { - let updatedApps; - - if (isSelectedAppPinned) { - // Remove the selected app if it is pinned - updatedApps = prev.filter( - (item) => !(item?.name === app?.name && item?.service === app?.service) + alt={app?.name} + src={`${getBaseApiReact()}/arbitrary/THUMBNAIL/${ + app?.name + }/qortal_avatar?async=true`} + > + center-icon + + + + + + {app?.metadata?.title || app?.name} + + + {app?.name} + + + + + + + + { + setSortablePinnedApps((prev) => { + let updatedApps; + + if (isSelectedAppPinned) { + // Remove the selected app if it is pinned + updatedApps = prev.filter( + (item) => + !( + item?.name === app?.name && + item?.service === app?.service + ) + ); + } else { + // Add the selected app if it is not pinned + updatedApps = [ + ...prev, + { + name: app?.name, + service: app?.service, + }, + ]; + } + + saveToLocalStorage( + 'ext_saved_settings', + 'sortablePinnedApps', + updatedApps ); - } else { - // Add the selected app if it is not pinned - updatedApps = [...prev, { - name: app?.name, - service: app?.service, - }]; - } - - saveToLocalStorage('ext_saved_settings', 'sortablePinnedApps', updatedApps) - return updatedApps; - }); - setSettingsLocalLastUpdated(Date.now()) - }} - sx={{ - backgroundColor: "#359ff7ff", - width: "100%", - maxWidth: "320px", - height: "29px", - opacity: isSelectedAppPinned ? 0.6 : 1 - }} - > - - {!isMobile ? ( - <> - {isSelectedAppPinned ? 'Unpin from dashboard' : 'Pin to dashboard'} - - ) : ( - <> - {isSelectedAppPinned ? 'Unpin' : 'Pin'} - - )} - - - - { - executeEvent("addTab", { - data: app, - }); - }} - sx={{ - backgroundColor: isInstalled ? "#0091E1" : "#247C0E", - width: "100%", - maxWidth: "320px", - height: "29px", - }} - > - - {isInstalled ? "Open" : "Download"} - - - - - - - - - - - - - - Category: - - - {app?.metadata?.categoryName || "none"} - - - - - About this Q-App - - - - {app?.metadata?.description || "No description"} - + return updatedApps; + }); + setSettingsLocalLastUpdated(Date.now()); + }} + sx={{ + backgroundColor: '#359ff7ff', + width: '100%', + maxWidth: '320px', + height: '29px', + opacity: isSelectedAppPinned ? 0.6 : 1, + }} + > + + {!isMobile ? ( + <> + {isSelectedAppPinned + ? 'Unpin from dashboard' + : 'Pin to dashboard'} + + ) : ( + <>{isSelectedAppPinned ? 'Unpin' : 'Pin'} + )} + + + { + executeEvent('addTab', { + data: app, + }); + }} + sx={{ + backgroundColor: isInstalled ? '#0091E1' : '#247C0E', + width: '100%', + maxWidth: '320px', + height: '29px', + }} + > + + {isInstalled ? 'Open' : 'Download'} + + + + + + + + + + + + + Category: + + + {app?.metadata?.categoryName || 'none'} + + + + + About this Q-App + + + + {app?.metadata?.description || 'No description'} + ); diff --git a/src/components/Apps/AppInfoSnippet.tsx b/src/components/Apps/AppInfoSnippet.tsx index 4870474..4cef858 100644 --- a/src/components/Apps/AppInfoSnippet.tsx +++ b/src/components/Apps/AppInfoSnippet.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React from 'react'; import { AppCircle, AppCircleContainer, @@ -10,148 +10,180 @@ import { AppInfoSnippetMiddle, AppInfoSnippetRight, AppInfoUserName, -} from "./Apps-styles"; -import { Avatar, ButtonBase } from "@mui/material"; -import { getBaseApiReact, isMobile } from "../../App"; -import LogoSelected from "../../assets/svgs/LogoSelected.svg"; +} from './Apps-styles'; +import { Avatar, ButtonBase } from '@mui/material'; +import { getBaseApiReact, isMobile } from '../../App'; +import LogoSelected from '../../assets/svgs/LogoSelected.svg'; -import { Spacer } from "../../common/Spacer"; -import { executeEvent } from "../../utils/events"; -import { AppRating } from "./AppRating"; -import { useRecoilState, useSetRecoilState } from "recoil"; -import { settingsLocalLastUpdatedAtom, sortablePinnedAppsAtom } from "../../atoms/global"; -import { saveToLocalStorage } from "./AppsNavBar"; +import { Spacer } from '../../common/Spacer'; +import { executeEvent } from '../../utils/events'; +import { AppRating } from './AppRating'; +import { useRecoilState, useSetRecoilState } from 'recoil'; +import { + settingsLocalLastUpdatedAtom, + sortablePinnedAppsAtom, +} from '../../atoms/global'; +import { saveToLocalStorage } from './AppsNavBarDesktop'; -export const AppInfoSnippet = ({ app, myName, isFromCategory, parentStyles = {} }) => { +export const AppInfoSnippet = ({ + app, + myName, + isFromCategory, + parentStyles = {}, +}) => { + const isInstalled = app?.status?.status === 'READY'; + const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( + sortablePinnedAppsAtom + ); - const isInstalled = app?.status?.status === 'READY' - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState(sortablePinnedAppsAtom); - - const isSelectedAppPinned = !!sortablePinnedApps?.find((item)=> item?.name === app?.name && item?.service === app?.service) - const setSettingsLocalLastUpdated = useSetRecoilState(settingsLocalLastUpdatedAtom); + const isSelectedAppPinned = !!sortablePinnedApps?.find( + (item) => item?.name === app?.name && item?.service === app?.service + ); + const setSettingsLocalLastUpdated = useSetRecoilState( + settingsLocalLastUpdatedAtom + ); return ( - + - { - if(isFromCategory){ - executeEvent("selectedAppInfoCategory", { + { + if (isFromCategory) { + executeEvent('selectedAppInfoCategory', { + data: app, + }); + return; + } + executeEvent('selectedAppInfo', { data: app, }); - return - } - executeEvent("selectedAppInfo", { - data: app, - }); - }} - > - - + + + + center-icon + + + + + + { + if (isFromCategory) { + executeEvent('selectedAppInfoCategory', { + data: app, + }); + return; + } + executeEvent('selectedAppInfo', { + data: app, + }); }} > - - center-icon - - - - - - - { - if(isFromCategory){ - executeEvent("selectedAppInfoCategory", { - data: app, - }); - return - } - executeEvent("selectedAppInfo", { - data: app, - }); - }}> - - {app?.metadata?.title || app?.name} - - - - - { app?.name} - + {app?.metadata?.title || app?.name} + + + {app?.name} - + - + {!isMobile && ( - { - - setSortablePinnedApps((prev) => { - let updatedApps; - - if (isSelectedAppPinned) { - // Remove the selected app if it is pinned - updatedApps = prev.filter( - (item) => !(item?.name === app?.name && item?.service === app?.service) - ); - } else { - // Add the selected app if it is not pinned - updatedApps = [...prev, { - name: app?.name, - service: app?.service, - }]; - } - - saveToLocalStorage('ext_saved_settings', 'sortablePinnedApps', updatedApps) - return updatedApps; - }); - setSettingsLocalLastUpdated(Date.now()) - }} sx={{ - backgroundColor: '#359ff7ff', - opacity: isSelectedAppPinned ? 0.6 : 1 - - }}> - {isSelectedAppPinned ? 'Unpin' : 'Pin'} - - )} - - { - - executeEvent("addTab", { - data: app - }) - }} sx={{ - backgroundColor: isInstalled ? '#0091E1' : '#247C0E', - - }}> - {isInstalled ? 'Open' : 'Download'} + { + setSortablePinnedApps((prev) => { + let updatedApps; + + if (isSelectedAppPinned) { + // Remove the selected app if it is pinned + updatedApps = prev.filter( + (item) => + !( + item?.name === app?.name && + item?.service === app?.service + ) + ); + } else { + // Add the selected app if it is not pinned + updatedApps = [ + ...prev, + { + name: app?.name, + service: app?.service, + }, + ]; + } + + saveToLocalStorage( + 'ext_saved_settings', + 'sortablePinnedApps', + updatedApps + ); + return updatedApps; + }); + setSettingsLocalLastUpdated(Date.now()); + }} + sx={{ + backgroundColor: '#359ff7ff', + opacity: isSelectedAppPinned ? 0.6 : 1, + }} + > + + {' '} + {isSelectedAppPinned ? 'Unpin' : 'Pin'} + + + )} + + { + executeEvent('addTab', { + data: app, + }); + }} + sx={{ + backgroundColor: isInstalled ? '#0091E1' : '#247C0E', + }} + > + + {isInstalled ? 'Open' : 'Download'} + diff --git a/src/components/Apps/SortablePinnedApps.tsx b/src/components/Apps/SortablePinnedApps.tsx index 30dcec7..f9a24a7 100644 --- a/src/components/Apps/SortablePinnedApps.tsx +++ b/src/components/Apps/SortablePinnedApps.tsx @@ -23,7 +23,7 @@ import { sortablePinnedAppsAtom, } from '../../atoms/global'; import { useRecoilState, useSetRecoilState } from 'recoil'; -import { saveToLocalStorage } from './AppsNavBar'; +import { saveToLocalStorage } from './AppsNavBarDesktop'; import { ContextMenuPinnedApps } from '../ContextMenuPinnedApps'; import LockIcon from '@mui/icons-material/Lock'; import { useHandlePrivateApps } from './useHandlePrivateApps'; diff --git a/src/components/ContextMenuPinnedApps.tsx b/src/components/ContextMenuPinnedApps.tsx index bb64a4c..7dad268 100644 --- a/src/components/ContextMenuPinnedApps.tsx +++ b/src/components/ContextMenuPinnedApps.tsx @@ -1,152 +1,182 @@ import React, { useState, useRef } from 'react'; -import { ListItemIcon, Menu, MenuItem, Typography, styled } from '@mui/material'; +import { + ListItemIcon, + Menu, + MenuItem, + Typography, + styled, +} from '@mui/material'; import PushPinIcon from '@mui/icons-material/PushPin'; -import { saveToLocalStorage } from './Apps/AppsNavBar'; +import { saveToLocalStorage } from './Apps/AppsNavBarDesktop'; import { useRecoilState } from 'recoil'; import { sortablePinnedAppsAtom } from '../atoms/global'; const CustomStyledMenu = styled(Menu)(({ theme }) => ({ - '& .MuiPaper-root': { - backgroundColor: '#f9f9f9', - borderRadius: '12px', - padding: theme.spacing(1), - boxShadow: '0 5px 15px rgba(0, 0, 0, 0.2)', - }, - '& .MuiMenuItem-root': { - fontSize: '14px', - color: '#444', - transition: '0.3s background-color', - '&:hover': { - backgroundColor: '#f0f0f0', - }, + '& .MuiPaper-root': { + backgroundColor: '#f9f9f9', + borderRadius: '12px', + padding: theme.spacing(1), + boxShadow: '0 5px 15px rgba(0, 0, 0, 0.2)', + }, + '& .MuiMenuItem-root': { + fontSize: '14px', + color: '#444', + transition: '0.3s background-color', + '&:hover': { + backgroundColor: '#f0f0f0', }, + }, })); export const ContextMenuPinnedApps = ({ children, app, isMine }) => { - const [menuPosition, setMenuPosition] = useState(null); - const longPressTimeout = useRef(null); - const maxHoldTimeout = useRef(null); - const preventClick = useRef(false); - const startTouchPosition = useRef({ x: 0, y: 0 }); // Track initial touch position - const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState(sortablePinnedAppsAtom); + const [menuPosition, setMenuPosition] = useState(null); + const longPressTimeout = useRef(null); + const maxHoldTimeout = useRef(null); + const preventClick = useRef(false); + const startTouchPosition = useRef({ x: 0, y: 0 }); // Track initial touch position + const [sortablePinnedApps, setSortablePinnedApps] = useRecoilState( + sortablePinnedAppsAtom + ); - const handleContextMenu = (event) => { - if(isMine) return - event.preventDefault(); - event.stopPropagation(); - preventClick.current = true; - setMenuPosition({ - mouseX: event.clientX, - mouseY: event.clientY, - }); - }; + const handleContextMenu = (event) => { + if (isMine) return; + event.preventDefault(); + event.stopPropagation(); + preventClick.current = true; + setMenuPosition({ + mouseX: event.clientX, + mouseY: event.clientY, + }); + }; - const handleTouchStart = (event) => { - if(isMine) return + const handleTouchStart = (event) => { + if (isMine) return; - const { clientX, clientY } = event.touches[0]; - startTouchPosition.current = { x: clientX, y: clientY }; + const { clientX, clientY } = event.touches[0]; + startTouchPosition.current = { x: clientX, y: clientY }; - longPressTimeout.current = setTimeout(() => { - preventClick.current = true; - - event.stopPropagation(); - setMenuPosition({ - mouseX: clientX, - mouseY: clientY, + longPressTimeout.current = setTimeout(() => { + preventClick.current = true; + + event.stopPropagation(); + setMenuPosition({ + mouseX: clientX, + mouseY: clientY, + }); + }, 500); + + // Set a maximum hold duration (e.g., 1.5 seconds) + maxHoldTimeout.current = setTimeout(() => { + clearTimeout(longPressTimeout.current); + }, 1500); + }; + + const handleTouchMove = (event) => { + if (isMine) return; + + const { clientX, clientY } = event.touches[0]; + const { x, y } = startTouchPosition.current; + + // Determine if the touch has moved beyond a small threshold (e.g., 10px) + const movedEnough = + Math.abs(clientX - x) > 10 || Math.abs(clientY - y) > 10; + + if (movedEnough) { + clearTimeout(longPressTimeout.current); + clearTimeout(maxHoldTimeout.current); + } + }; + + const handleTouchEnd = (event) => { + if (isMine) return; + + clearTimeout(longPressTimeout.current); + clearTimeout(maxHoldTimeout.current); + if (preventClick.current) { + event.preventDefault(); + event.stopPropagation(); + preventClick.current = false; + } + }; + + const handleClose = (e) => { + if (isMine) return; + + e.preventDefault(); + e.stopPropagation(); + setMenuPosition(null); + }; + + return ( +
+ {children} + { + e.stopPropagation(); + }} + > + { + handleClose(e); + setSortablePinnedApps((prev) => { + if (app?.isPrivate) { + const updatedApps = prev.filter( + (item) => + !( + item?.privateAppProperties?.name === + app?.privateAppProperties?.name && + item?.privateAppProperties?.service === + app?.privateAppProperties?.service && + item?.privateAppProperties?.identifier === + app?.privateAppProperties?.identifier + ) + ); + saveToLocalStorage( + 'ext_saved_settings', + 'sortablePinnedApps', + updatedApps + ); + return updatedApps; + } else { + const updatedApps = prev.filter( + (item) => + !( + item?.name === app?.name && item?.service === app?.service + ) + ); + saveToLocalStorage( + 'ext_saved_settings', + 'sortablePinnedApps', + updatedApps + ); + return updatedApps; + } }); - }, 500); - - // Set a maximum hold duration (e.g., 1.5 seconds) - maxHoldTimeout.current = setTimeout(() => { - clearTimeout(longPressTimeout.current); - }, 1500); - }; - - const handleTouchMove = (event) => { - if(isMine) return - - const { clientX, clientY } = event.touches[0]; - const { x, y } = startTouchPosition.current; - - // Determine if the touch has moved beyond a small threshold (e.g., 10px) - const movedEnough = Math.abs(clientX - x) > 10 || Math.abs(clientY - y) > 10; - - if (movedEnough) { - clearTimeout(longPressTimeout.current); - clearTimeout(maxHoldTimeout.current); - } - }; - - const handleTouchEnd = (event) => { - if(isMine) return - - clearTimeout(longPressTimeout.current); - clearTimeout(maxHoldTimeout.current); - if (preventClick.current) { - event.preventDefault(); - event.stopPropagation(); - preventClick.current = false; - } - }; - - const handleClose = (e) => { - if(isMine) return - - e.preventDefault(); - e.stopPropagation(); - setMenuPosition(null); - }; - - return ( -
- {children} - { - e.stopPropagation(); - }} - > - { - handleClose(e); - setSortablePinnedApps((prev) => { - if(app?.isPrivate){ - const updatedApps = prev.filter( - (item) => !(item?.privateAppProperties?.name === app?.privateAppProperties?.name && item?.privateAppProperties?.service === app?.privateAppProperties?.service && item?.privateAppProperties?.identifier === app?.privateAppProperties?.identifier) - ); - saveToLocalStorage('ext_saved_settings', 'sortablePinnedApps', updatedApps); - return updatedApps; - } else { - const updatedApps = prev.filter( - (item) => !(item?.name === app?.name && item?.service === app?.service) - ); - saveToLocalStorage('ext_saved_settings', 'sortablePinnedApps', updatedApps); - return updatedApps; - } - }); - }}> - - - - - Unpin app - - - -
- ); + + + + + Unpin app + +
+
+
+ ); }; diff --git a/src/components/Save/Save.tsx b/src/components/Save/Save.tsx index cf8dba6..c8196d8 100644 --- a/src/components/Save/Save.tsx +++ b/src/components/Save/Save.tsx @@ -19,7 +19,7 @@ import { SaveIcon } from '../../assets/Icons/SaveIcon'; import { IconWrapper } from '../Desktop/DesktopFooter'; import { Spacer } from '../../common/Spacer'; import { LoadingButton } from '@mui/lab'; -import { saveToLocalStorage } from '../Apps/AppsNavBar'; +import { saveToLocalStorage } from '../Apps/AppsNavBarDesktop'; import { decryptData, encryptData } from '../../qortalRequests/get'; import { saveFileToDiskGeneric } from '../../utils/generateWallet/generateWallet'; import { diff --git a/src/components/Tutorials/useHandleTutorials.tsx b/src/components/Tutorials/useHandleTutorials.tsx index 2fabfa0..1df8626 100644 --- a/src/components/Tutorials/useHandleTutorials.tsx +++ b/src/components/Tutorials/useHandleTutorials.tsx @@ -1,192 +1,194 @@ -import React, { useCallback, useEffect, useState } from "react"; -import { saveToLocalStorage } from "../Apps/AppsNavBar"; -import creationImg from './img/creation.webp' -import dashboardImg from './img/dashboard.webp' -import groupsImg from './img/groups.webp' -import importantImg from './img/important.webp' -import navigationImg from './img/navigation.webp' -import overviewImg from './img/overview.webp' -import startedImg from './img/started.webp' -import obtainingImg from './img/obtaining-qort.jpg' +import { useCallback, useEffect, useState } from 'react'; +import { saveToLocalStorage } from '../Apps/AppsNavBarDesktop'; +import creationImg from './img/creation.webp'; +import dashboardImg from './img/dashboard.webp'; +import groupsImg from './img/groups.webp'; +import importantImg from './img/important.webp'; +import navigationImg from './img/navigation.webp'; +import overviewImg from './img/overview.webp'; +import startedImg from './img/started.webp'; +import obtainingImg from './img/obtaining-qort.jpg'; const checkIfGatewayIsOnline = async () => { - try { - const url = `https://ext-node.qortal.link/admin/status`; - const response = await fetch(url, { - method: "GET", - headers: { - "Content-Type": "application/json", - }, - }); - const data = await response.json(); - if (data?.height) { - return true - } - return false - - } catch (error) { - return false - - } + try { + const url = `https://ext-node.qortal.link/admin/status`; + const response = await fetch(url, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + const data = await response.json(); + if (data?.height) { + return true; + } + return false; + } catch (error) { + return false; } +}; export const useHandleTutorials = () => { const [openTutorialModal, setOpenTutorialModal] = useState(null); -const [shownTutorials, setShowTutorials] = useState(null) + const [shownTutorials, setShowTutorials] = useState(null); -useEffect(()=> { + useEffect(() => { try { - const storedData = localStorage.getItem('shown-tutorials'); + const storedData = localStorage.getItem('shown-tutorials'); - - if (storedData) { - setShowTutorials(JSON.parse(storedData)); - } else { - setShowTutorials({}) - } + if (storedData) { + setShowTutorials(JSON.parse(storedData)); + } else { + setShowTutorials({}); + } } catch (error) { - //error + //error } -}, []) + }, []); - const saveShowTutorial = useCallback((type)=> { + const saveShowTutorial = useCallback((type) => { try { - - setShowTutorials((prev)=> { - return { - ...(prev || {}), - [type]: true - } - }) - saveToLocalStorage('shown-tutorials', type, true) + setShowTutorials((prev) => { + return { + ...(prev || {}), + [type]: true, + }; + }); + saveToLocalStorage('shown-tutorials', type, true); } catch (error) { - //error + //error } - }, []) - const showTutorial = useCallback(async (type, isForce) => { - try { - const isOnline = await checkIfGatewayIsOnline() - if(!isOnline) return + }, []); + const showTutorial = useCallback( + async (type, isForce) => { + try { + const isOnline = await checkIfGatewayIsOnline(); + if (!isOnline) return; switch (type) { - case "create-account": - { - if((shownTutorials || {})['create-account'] && !isForce) return - saveShowTutorial('create-account') - setOpenTutorialModal({ - title: "Account Creation", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "account-creation-hub", - poster: creationImg - }, - }); - } - break; - case "important-information": - { - if((shownTutorials || {})['important-information'] && !isForce) return - saveShowTutorial('important-information') + case 'create-account': + { + if ((shownTutorials || {})['create-account'] && !isForce) return; + saveShowTutorial('create-account'); + setOpenTutorialModal({ + title: 'Account Creation', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'account-creation-hub', + poster: creationImg, + }, + }); + } + break; + case 'important-information': + { + if ((shownTutorials || {})['important-information'] && !isForce) + return; + saveShowTutorial('important-information'); - setOpenTutorialModal({ - title: "Important Information!", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "important-information-hub", - poster: importantImg - }, - }); - } - break; - case "getting-started": - { - if((shownTutorials || {})['getting-started'] && !isForce) return - saveShowTutorial('getting-started') + setOpenTutorialModal({ + title: 'Important Information!', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'important-information-hub', + poster: importantImg, + }, + }); + } + break; + case 'getting-started': + { + if ((shownTutorials || {})['getting-started'] && !isForce) return; + saveShowTutorial('getting-started'); - setOpenTutorialModal({ - multi: [ - - { - title: "1. Getting Started", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "getting-started-hub", - poster: startedImg - }, - }, - { - title: "2. Overview", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "overview-hub", - poster: overviewImg - }, - }, - { - title: "3. Qortal Groups", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "groups-hub", - poster: groupsImg - }, - }, - { - title: "4. Obtaining Qort", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "obtaining-qort", - poster: obtainingImg - }, - }, - ], - }); - } - break; - case "qapps": + setOpenTutorialModal({ + multi: [ { - if((shownTutorials || {})['qapps'] && !isForce) return - saveShowTutorial('qapps') + title: '1. Getting Started', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'getting-started-hub', + poster: startedImg, + }, + }, + { + title: '2. Overview', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'overview-hub', + poster: overviewImg, + }, + }, + { + title: '3. Qortal Groups', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'groups-hub', + poster: groupsImg, + }, + }, + { + title: '4. Obtaining Qort', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'obtaining-qort', + poster: obtainingImg, + }, + }, + ], + }); + } + break; + case 'qapps': + { + if ((shownTutorials || {})['qapps'] && !isForce) return; + saveShowTutorial('qapps'); - setOpenTutorialModal({ - multi: [ - { - title: "1. Apps Dashboard", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "apps-dashboard-hub", - poster: dashboardImg - }, - }, - { - title: "2. Apps Navigation", - resource: { - name: "a-test", - service: "VIDEO", - identifier: "apps-navigation-hub", - poster: navigationImg - }, - } - ], - }); - } - break; - default: - break; - } - } catch (error) { + setOpenTutorialModal({ + multi: [ + { + title: '1. Apps Dashboard', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'apps-dashboard-hub', + poster: dashboardImg, + }, + }, + { + title: '2. Apps Navigation', + resource: { + name: 'a-test', + service: 'VIDEO', + identifier: 'apps-navigation-hub', + poster: navigationImg, + }, + }, + ], + }); + } + break; + default: + break; + } + } catch (error) { //error - } - }, [shownTutorials]); + } + }, + [shownTutorials] + ); return { showTutorial, - hasSeenGettingStarted: shownTutorials === null ? null : !!(shownTutorials || {})['getting-started'], + hasSeenGettingStarted: + shownTutorials === null + ? null + : !!(shownTutorials || {})['getting-started'], openTutorialModal, setOpenTutorialModal, - shownTutorialsInitiated: !!shownTutorials + shownTutorialsInitiated: !!shownTutorials, }; }; From 40d6803bc210b9fb29a37165a968f1d985234232 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 14:26:01 +0200 Subject: [PATCH 04/39] Remove android folder --- android/.gitignore | 101 ------- android/app/.gitignore | 2 - android/app/build.gradle | 54 ---- android/app/capacitor.build.gradle | 23 -- android/app/proguard-rules.pro | 21 -- .../myapp/ExampleInstrumentedTest.java | 26 -- android/app/src/main/AndroidManifest.xml | 45 ---- .../app/BackgroundFetchHeadlessTask.java | 31 --- .../java/com/example/app/MainActivity.java | 5 - .../main/res/drawable-land-hdpi/splash.png | Bin 7705 -> 0 bytes .../main/res/drawable-land-mdpi/splash.png | Bin 4040 -> 0 bytes .../main/res/drawable-land-xhdpi/splash.png | Bin 9251 -> 0 bytes .../main/res/drawable-land-xxhdpi/splash.png | Bin 13984 -> 0 bytes .../main/res/drawable-land-xxxhdpi/splash.png | Bin 17683 -> 0 bytes .../main/res/drawable-port-hdpi/splash.png | Bin 7934 -> 0 bytes .../main/res/drawable-port-mdpi/splash.png | Bin 4096 -> 0 bytes .../main/res/drawable-port-xhdpi/splash.png | Bin 9875 -> 0 bytes .../main/res/drawable-port-xxhdpi/splash.png | Bin 13346 -> 0 bytes .../main/res/drawable-port-xxxhdpi/splash.png | Bin 17489 -> 0 bytes .../drawable-v24/ic_launcher_foreground.xml | 34 --- .../res/drawable/ic_launcher_background.xml | 170 ------------ android/app/src/main/res/drawable/qort.png | Bin 1907 -> 0 bytes android/app/src/main/res/drawable/splash.png | Bin 163932 -> 0 bytes .../app/src/main/res/layout/activity_main.xml | 12 - .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 6229 -> 0 bytes .../mipmap-hdpi/ic_launcher_adaptive_back.png | Bin 3838 -> 0 bytes .../mipmap-hdpi/ic_launcher_adaptive_fore.png | Bin 7458 -> 0 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 3925 -> 0 bytes .../mipmap-mdpi/ic_launcher_adaptive_back.png | Bin 2041 -> 0 bytes .../mipmap-mdpi/ic_launcher_adaptive_fore.png | Bin 4426 -> 0 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 9001 -> 0 bytes .../ic_launcher_adaptive_back.png | Bin 6519 -> 0 bytes .../ic_launcher_adaptive_fore.png | Bin 11597 -> 0 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 15567 -> 0 bytes .../ic_launcher_adaptive_back.png | Bin 10836 -> 0 bytes .../ic_launcher_adaptive_fore.png | Bin 21943 -> 0 bytes .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin 23027 -> 0 bytes .../ic_launcher_adaptive_back.png | Bin 16050 -> 0 bytes .../ic_launcher_adaptive_fore.png | Bin 34387 -> 0 bytes .../res/values/ic_launcher_background.xml | 4 - android/app/src/main/res/values/strings.xml | 7 - android/app/src/main/res/values/styles.xml | 22 -- android/app/src/main/res/xml/file_paths.xml | 5 - .../getcapacitor/myapp/ExampleUnitTest.java | 18 -- android/build.gradle | 33 --- android/capacitor.settings.gradle | 18 -- android/gradle.properties | 22 -- android/gradle/wrapper/gradle-wrapper.jar | Bin 63375 -> 0 bytes .../gradle/wrapper/gradle-wrapper.properties | 7 - android/gradlew | 248 ------------------ android/gradlew.bat | 92 ------- android/settings.gradle | 5 - android/variables.gradle | 16 -- 54 files changed, 1026 deletions(-) delete mode 100644 android/.gitignore delete mode 100644 android/app/.gitignore delete mode 100644 android/app/build.gradle delete mode 100644 android/app/capacitor.build.gradle delete mode 100644 android/app/proguard-rules.pro delete mode 100644 android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java delete mode 100644 android/app/src/main/AndroidManifest.xml delete mode 100644 android/app/src/main/java/com/example/app/BackgroundFetchHeadlessTask.java delete mode 100644 android/app/src/main/java/com/example/app/MainActivity.java delete mode 100644 android/app/src/main/res/drawable-land-hdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-land-mdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-land-xhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-land-xxhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-land-xxxhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-port-hdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-port-mdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-port-xhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-port-xxhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-port-xxxhdpi/splash.png delete mode 100644 android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml delete mode 100644 android/app/src/main/res/drawable/ic_launcher_background.xml delete mode 100644 android/app/src/main/res/drawable/qort.png delete mode 100644 android/app/src/main/res/drawable/splash.png delete mode 100644 android/app/src/main/res/layout/activity_main.xml delete mode 100644 android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png delete mode 100644 android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_fore.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png delete mode 100644 android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_fore.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_back.png delete mode 100644 android/app/src/main/res/mipmap-xhdpi/ic_launcher_adaptive_fore.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png delete mode 100644 android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_back.png delete mode 100644 android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png delete mode 100644 android/app/src/main/res/values/ic_launcher_background.xml delete mode 100644 android/app/src/main/res/values/strings.xml delete mode 100644 android/app/src/main/res/values/styles.xml delete mode 100644 android/app/src/main/res/xml/file_paths.xml delete mode 100644 android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java delete mode 100644 android/build.gradle delete mode 100644 android/capacitor.settings.gradle delete mode 100644 android/gradle.properties delete mode 100644 android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 android/gradle/wrapper/gradle-wrapper.properties delete mode 100755 android/gradlew delete mode 100644 android/gradlew.bat delete mode 100644 android/settings.gradle delete mode 100644 android/variables.gradle diff --git a/android/.gitignore b/android/.gitignore deleted file mode 100644 index 48354a3..0000000 --- a/android/.gitignore +++ /dev/null @@ -1,101 +0,0 @@ -# Using Android gitignore template: https://github.com/github/gitignore/blob/HEAD/Android.gitignore - -# Built application files -*.apk -*.aar -*.ap_ -*.aab - -# Files for the ART/Dalvik VM -*.dex - -# Java class files -*.class - -# Generated files -bin/ -gen/ -out/ -# Uncomment the following line in case you need and you don't have the release build type files in your app -# release/ - -# Gradle files -.gradle/ -build/ - -# Local configuration file (sdk path, etc) -local.properties - -# Proguard folder generated by Eclipse -proguard/ - -# Log Files -*.log - -# Android Studio Navigation editor temp files -.navigation/ - -# Android Studio captures folder -captures/ - -# IntelliJ -*.iml -.idea/workspace.xml -.idea/tasks.xml -.idea/gradle.xml -.idea/assetWizardSettings.xml -.idea/dictionaries -.idea/libraries -# Android Studio 3 in .gitignore file. -.idea/caches -.idea/modules.xml -# Comment next line if keeping position of elements in Navigation Editor is relevant for you -.idea/navEditor.xml - -# Keystore files -# Uncomment the following lines if you do not want to check your keystore files in. -#*.jks -#*.keystore - -# External native build folder generated in Android Studio 2.2 and later -.externalNativeBuild -.cxx/ - -# Google Services (e.g. APIs or Firebase) -# google-services.json - -# Freeline -freeline.py -freeline/ -freeline_project_description.json - -# fastlane -fastlane/report.xml -fastlane/Preview.html -fastlane/screenshots -fastlane/test_output -fastlane/readme.md - -# Version control -vcs.xml - -# lint -lint/intermediates/ -lint/generated/ -lint/outputs/ -lint/tmp/ -# lint/reports/ - -# Android Profiling -*.hprof - -# Cordova plugins for Capacitor -capacitor-cordova-android-plugins - -# Copied web assets -app/src/main/assets/public - -# Generated Config files -app/src/main/assets/capacitor.config.json -app/src/main/assets/capacitor.plugins.json -app/src/main/res/xml/config.xml diff --git a/android/app/.gitignore b/android/app/.gitignore deleted file mode 100644 index 043df80..0000000 --- a/android/app/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build/* -!/build/.npmkeep diff --git a/android/app/build.gradle b/android/app/build.gradle deleted file mode 100644 index 3f5e684..0000000 --- a/android/app/build.gradle +++ /dev/null @@ -1,54 +0,0 @@ -apply plugin: 'com.android.application' - -android { - namespace "com.example.app" - compileSdk rootProject.ext.compileSdkVersion - defaultConfig { - applicationId "com.example.app" - minSdkVersion rootProject.ext.minSdkVersion - targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 1 - versionName "1.0" - testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - aaptOptions { - // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. - // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 - ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' - } - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } -} - -repositories { - flatDir{ - dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' - } -} - -dependencies { - implementation fileTree(include: ['*.jar'], dir: 'libs') - implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion" - implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion" - implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion" - implementation project(':capacitor-android') - testImplementation "junit:junit:$junitVersion" - androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion" - androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion" - implementation project(':capacitor-cordova-android-plugins') -} - -apply from: 'capacitor.build.gradle' - -try { - def servicesJSON = file('google-services.json') - if (servicesJSON.text) { - apply plugin: 'com.google.gms.google-services' - } -} catch(Exception e) { - logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work") -} diff --git a/android/app/capacitor.build.gradle b/android/app/capacitor.build.gradle deleted file mode 100644 index d4f22b6..0000000 --- a/android/app/capacitor.build.gradle +++ /dev/null @@ -1,23 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN - -android { - compileOptions { - sourceCompatibility JavaVersion.VERSION_17 - targetCompatibility JavaVersion.VERSION_17 - } -} - -apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" -dependencies { - implementation project(':capacitor-browser') - implementation project(':capacitor-filesystem') - implementation project(':capacitor-local-notifications') - implementation project(':evva-capacitor-secure-storage-plugin') - implementation project(':transistorsoft-capacitor-background-fetch') - implementation "androidx.webkit:webkit:1.4.0" -} - - -if (hasProperty('postBuildExtras')) { - postBuildExtras() -} diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro deleted file mode 100644 index f1b4245..0000000 --- a/android/app/proguard-rules.pro +++ /dev/null @@ -1,21 +0,0 @@ -# Add project specific ProGuard rules here. -# You can control the set of applied configuration files using the -# proguardFiles setting in build.gradle. -# -# For more details, see -# http://developer.android.com/guide/developing/tools/proguard.html - -# If your project uses WebView with JS, uncomment the following -# and specify the fully qualified class name to the JavaScript interface -# class: -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { -# public *; -#} - -# Uncomment this to preserve the line number information for -# debugging stack traces. -#-keepattributes SourceFile,LineNumberTable - -# If you keep the line number information, uncomment this to -# hide the original source file name. -#-renamesourcefileattribute SourceFile diff --git a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java deleted file mode 100644 index f2c2217..0000000 --- a/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import android.content.Context; -import androidx.test.ext.junit.runners.AndroidJUnit4; -import androidx.test.platform.app.InstrumentationRegistry; -import org.junit.Test; -import org.junit.runner.RunWith; - -/** - * Instrumented test, which will execute on an Android device. - * - * @see Testing documentation - */ -@RunWith(AndroidJUnit4.class) -public class ExampleInstrumentedTest { - - @Test - public void useAppContext() throws Exception { - // Context of the app under test. - Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); - - assertEquals("com.getcapacitor.app", appContext.getPackageName()); - } -} diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml deleted file mode 100644 index 2b2013c..0000000 --- a/android/app/src/main/AndroidManifest.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/java/com/example/app/BackgroundFetchHeadlessTask.java b/android/app/src/main/java/com/example/app/BackgroundFetchHeadlessTask.java deleted file mode 100644 index fac2dc1..0000000 --- a/android/app/src/main/java/com/example/app/BackgroundFetchHeadlessTask.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.example.app; - - -import android.content.Context; -import android.util.Log; - -import com.transistorsoft.tsbackgroundfetch.BackgroundFetch; -import com.transistorsoft.tsbackgroundfetch.BGTask; - -public class BackgroundFetchHeadlessTask{ - public void onFetch(Context context, BGTask task) { - // Get a reference to the BackgroundFetch Android API. - BackgroundFetch backgroundFetch = BackgroundFetch.getInstance(context); - // Get the taskId. - String taskId = task.getTaskId(); - // Log a message to adb logcat. - Log.d("MyHeadlessTask", "BackgroundFetchHeadlessTask onFetch -- CUSTOM IMPLEMENTATION: " + taskId); - - boolean isTimeout = task.getTimedOut(); - // Is this a timeout? - if (isTimeout) { - backgroundFetch.finish(taskId); - return; - } - // Do your work here... - // - // - // Signal finish just like the Javascript API. - backgroundFetch.finish(taskId); - } -} \ No newline at end of file diff --git a/android/app/src/main/java/com/example/app/MainActivity.java b/android/app/src/main/java/com/example/app/MainActivity.java deleted file mode 100644 index 966f32d..0000000 --- a/android/app/src/main/java/com/example/app/MainActivity.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.example.app; - -import com.getcapacitor.BridgeActivity; - -public class MainActivity extends BridgeActivity {} diff --git a/android/app/src/main/res/drawable-land-hdpi/splash.png b/android/app/src/main/res/drawable-land-hdpi/splash.png deleted file mode 100644 index e31573b4fc93e60d171f4046c0220e1463075d9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7705 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 wKmFJ0_JHhk1&0B>;%YXATM diff --git a/android/app/src/main/res/drawable-land-mdpi/splash.png b/android/app/src/main/res/drawable-land-mdpi/splash.png deleted file mode 100644 index f7a64923ea1a0565d25fa139c176d6bf42184e48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4040 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 XyOn+%7f`N3b2T^T3uj5+eShz7v)7qy diff --git a/android/app/src/main/res/drawable-land-xhdpi/splash.png b/android/app/src/main/res/drawable-land-xhdpi/splash.png deleted file mode 100644 index 807725501bdd92e94e51e7b2b0006f69e0083a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9251 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 diff --git a/android/app/src/main/res/drawable-land-xxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxhdpi/splash.png deleted file mode 100644 index 14c6c8fe39fcd51a0414866ad28cbe8ff3acb060..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13984 zcmeHt`Cn4$+dnnUI8CXgla?FPH05V<%gWT;TBe+G)JhTDP;As(abHlh$zmkpu$5hgra^=kAE5J2!R|qapsrf-f2VA0{`2g;py+@CM!GM7RGJgbN^Pw*^tDu z_xDf4ZTq#$<4R>g=G6|nKLf6t2{(O}fDbYJ^&HG@XX_tk@ckMNiZaNZ{Tsgd$-eYl zNzZYkt8RO?v4RWV6yEuKRz_F&Nw9-M7T-R?g(s`CLJ!eWWm8B)QOF>(O6gl8X#*^U zTqfpU{u=l^7Pe6j{JVZL0{r-AU+@Ot*a`qsJS*2%Jo@E|gSI(viEnY|oflr@qew}|Js+?1$G)vyhhVLD_8MA4d= zd?-WS;nkPz-8QwHCLA*0)grOZT^tOF@d&j6615jNCA{X!@g4gOc|@dK_6utx#OLg@ zjgU))@<`F_$$t0A!9H>=hMWDyjCMKs6W6xeN&V%f)4)x40~iKO75_dm`MmZ4x#oY= zMm$r7o=nIi#I}8wb~7GlT+-SCK^Sk?0tud+=PuGYT{SXj)`>{5C$%zIoEuU5+Cktl zhiF$P#vcesuYWsicXfw|47uFA9kBk$GDhB^#9i89U42oUajutg6-ys_jVuYwF{4OG z9G!B&R^Ca#jCTWs)a)acPR8>4&-r=(#D4O{8n(@y7+L80MN^_%+^OLV)zH8>+hj4! z3Lv&lu-Aa+gx!GW;euM^>J(Xt$GdFrpNQQVfR{S>K2%`kA3^$ zErs3T9}i_Guan?ruE1%R-lSq2p;Gc6f&1GQ5|N$&6NX>ILFs)*xVZrh~XJ2F79 ziVi28PNw7QUOpJQ%5@|F#`1wS^=wyjJ-ix#RuLQwuhj^B(r15M-yj1ee|J73dNho(%4*~aI|dpLFEkO*lBQ& zmQ3ZnMFGd10>{3JXbI{(;0M#TE)tq?F+^#Pm~+82u{6$$#Mq_*i#4=D%QR?ng(yBv z$E@7&dxjz;^S%4pJqYA!#X`^qNL=m8XV1Y={wipORSI2V;Z%*ujQ z7P`n}!I4=) z>Mj`HiX2O4MO^0c+nFBcxx>&KZFfnfN5{VoOx}+sp6E^udeMX|Vq#OiBTKq^?lm&a z6>mJz4VcFj1=-5n#c-EN=(mtRZvrB_;*=K)e*_t`_7LqNh`kV@{4m?_)<#1+yr+*A zNgpWEuTo3MEoE?yI(zAaN=8yr?c*u4pPNKCWUd5exGsQVmks|#!=5aES5^4l3ZDC8Dx1U~7 z82`^sff|9CD`Ty)xpas)_c`I9Ws$fXr<5}Hpt!lqlT{?j)#~MC(TDe}PIrN)Jw33!c^3fyU7{LK1X=3Oy9#=w>Iq9mx^eXyf(GJq>zo!(*6>bCYCexqR`> zSAE7$mg=L>yX^uN(oT?F+;&U#&qM$(XUrc7!Td z{szku6SvqT^|TXrcQI63d7&1$=t{GArQvJj28h`n0E)v$!Z$;2s!Y(|kY3IHy^Cp} zo)&S6n+bPNY5TJtsdPqF^2OO4T-0^3hKEvj#2INhw!i1A!hYLwYjgQ`5X2s^InVs7 z(&;s!PQd#a_=EIX+_iruqY=tAZY{F&d1iDZ?|ztnTPCu zdoOaZn^lg7jrWb%Je;BpTlGxu%Y_BwwM{Hj+k`6k+%4%e%=dFWqC%sv(@CQzLE^LO z1%k*1eP1oNC#K-MZ$H8pa+^00yb}>Mqnns8TcY}DC4DFZ$`Z(;l`%!)+e54N?oRW@br3X{%v&oW9;kuBY+D>$orVg(Uiy^+W8#bYiJT-+AR;4Kum zwbeN;RQh$t=MSQ%kFy(8v+T>E|`y~o;? znAf675OkWbu$$ee;Zls(9kHyXxK`@7D$HM<@TN$o1)pifh+ZJs2I~QLB7OiONl5zW zm-(JEffEWHXI$7L@ow$XlJ3mX**QgTjy#sg_fWp;zhA2B|M8J(YnOMk*v>`}N5-(L zDEY%B{xS@9MJ!ZWeGReG1fUJZ0_^#L+p@RvnGugQH`U!8)T-hf^!{gx&z~KzbFy(Z z*)yAaPf(D~?$J+U5D5_U_Kus<^0;l1_K%3IMcS4Ct6mV?cqn)Az#mqr%H31-Z#1D)O>Q=SV2NU~EMwQfot@ z1KD-XpW*b!=A3VO6|Je#jl_>m-w~?Q7uB)@89+A$iHNKP^xfIGgt!)&to3hPLE>tL(%&|Hzr_XgJ0nvEk6g8-N~s1U&eGWX9>pgWfbHS@KSm)T#zfo>`@)u+Fk_bcd!! zTPVxDITU^qe;Nkw8f0^JTdFY&iUJIP;${HFKfQxU4Eg6bsa?Bj_`5T<;9+}o|<}EEd-;i&$ceD}cUEw(Zul=6%@!sO6xCFAK-2FnR zQAmC|E5DPsFvqv__+UOpL=^=MDF0KqgnEYgmSBIN6)}foHc**IMn5Z8+%`aZHv!oF zI_bdaa23Bbhmb)F)4{>?87BoP4P8rpH6vk9mw?9a z0*&u=h2CJUNZ2`;+uo!bUIn3u3GDJRe7Z91s3KQ>E_3;Yc%vBA^l-+_4*5HuerxJR z$}Jz;3Zs=efK1{_zle}O+30rjEKwUfhp}?Fp&nYdpG)mRm+`A{Jg=6ZQYmybJ8Q;p zP9wYNXZP;;K70pyEo9|Y1NZAY?pOD-Oi35Yl{SH>*AiH?1a?u?k4y_(Vd*c~ZiG}= z>;q`Fu&Uhvn*MuYDY=>usm1S{>6@R+ELQbpOMX(I0`WdcFfTa!7=QkPK9t?XbY{?S zz1^xT`z*!RpiTszv)C|FKbBk8YZ0G>}Hax zEkdd-6H9OtGlJNbe7+DvS} zTmfj{x@rIh;k9wiSw~3chHNwyXpO_7q!v7Iv$A#ssE?2(1s`e z^r85Mw=)|Zk|xp<0iO98lpKY;H<@JM$Xlgf#vt8jdL$ z>!EvvQ7rrx-iOvXK;rNqvy~TW5^Pflj{_vgIzp^T&T{1pPJgi2^KX<~MIIXWX>&?M zgd*I6iVLNqqT{r!QHv}iKwSHQYhOk8>NxAb8>NisWe=y0!_K=3l9E5)>A&w_)fGrJ zp2Tj34vmx@$lWo&YUFb-nR+*y@4`LB73aR#!5vLi0devIiJe!+pE6+|tmhx@pYFw4 z8%9N@))Z$;Iz(hK&qpRTzL%DNO zrN_J$=u@Ix!OM{{ay1JtJN53AuTezBgW-e#f=OqjK5IA+sO5cNI}h<<8RU3uCGbOpdov_v3^J5n3j-DQ}- z!Pp!7-TTFQnuIm~RZjW*WBUc5EwF!a>#{p-!l+<|+rHmC5-7ymu^|H;;#m|j#aaBRX^+JzAwzq&h; z!Wn>hfG1zD_j}x!Ge>!|yyP!wVcdZ?PuoOYSG`Ok5Aqbny5+1$Qe65j_Kkm+U6U3p z{N$c*fY`!7@!o$CsODb-p0m!{b}>>0`UQ9zJ=G>u zn-ABt@#jf*g?@8gk_i(qJ(7XZ!ey_T(Yzf!G|k>4t<)`jlG`~GzU^c6x@}ftwJ4`i zB!W(l3c5F>*6X@z>)qDa;XXJ#r3E4W1%Os@gi<-fT3s6IZpwH=^dQB0wNf+XLZ_Kr zo6)kk1qbaEW|EN}&a&BAg{Xv@ClC9zyM}MxaM|X|&t4iNR~dg(7G^ph@*ihu#Ph~V zKfgvds6$`Ve?`}Ko`LnGtn0q)EaKRb<d|&Dog0eoa4g_@<3UPz(t8EGJpvIg8I*+9®q@N z14_H8ofW)l{|J8q+a)eH)I0r)>WXdzV%7J>PA~6_J)KLT90iYa^K=Wz7D!OybzqSru=f4?|KFl;Y)gP_H6V4x`~kZ6fE(xM1&;?72-TZNk+0 zr+Crr5yl%Iy@vfmt3eYFl!jIvPGFz^8Ek+2`48O1_pCX3xNWh-zBa{rIcc%+=|XVj zANYTg&s}TKb#OztQrCW(Xk?V^i{`q~%HtcveTxq(_HKeC9GzrtguMT4Nvs@KakPTA z9>*8bBZmLz`lK5=l)=b|=dT3a5ag^a1^znZyx5QKfUb1b9yacArRp%3@QWo(hrsCU z-K!-=jDmv!zb7XT>)r|-Z0Ry}lk2;dk-ECqMwr_nKN#x*X6~B5hVIN>6$1HwBz3Of z=Pk){AL5*=d90f17_qZEJLm;Q%WMdX=*N&!ki@E&cy7?>{1ssAH(tACtp*r@d^til z)x(1#6(kPD+joSF&J3sxJU@{-sWCS+pZq{Gsx=?z4wP;>?)1yHv0?X?VP{}cX4~aH zxeBPKw_rgW8rvewS1W2#^y+c>-183iMbJCqc38RN_o~__9-n|jcd&oA`m7*&Fqqpc z;Tev*0LS-ZK47Sq1unfvP1S43uA12P?PJmI8BeTYPr~R*tYUm^0;U%Hmu?bSZHEK6 zPjsW=E67Kq-&trmf;)UkmRABH2U)V)-eRT$j(%G12lLMsThSsU10iP#{)ZnvjzN$d z*K%P3`}oqyvpWP~venr>3viH8^`)Ma*=B31hw*Q+tqE>i2y7w!(o^lI^Yss^=tHW( z;cnCT(%B1gLz+TRGW9roFjI1EQTu-u`(f#RmZ8;FSN(bsC1J;+(i_R6mrW=yYx$cy z#%QKVrEx~kVMg~yo?^N28Wnk6x%L;J8i|*|ANEiNjq(Vhzuzl3ikpA*G!Z}kLAzAI z9qnySo%D|AuJj12%h;Otqjs(>LPj?rNdeU8so>P(C>XMzlho94ZD#w=cCOOU;=3&^ zsqAG!i{~lY271D|m>ztPV`)X@FO_;`wPjppYNQpM+ncvtz1lZjN>!Q^*I}T%uP78Z7tbV2$q3W_)14=kLFyJ z1GqL6T>ClgeZorL!}xP4f%OB_EsmJ`uw7dGWNV9OLlhb|UMpVhc{4@Bhh`tO!ZqzD zhusd<=K^ah!L@gQ?6dOpI-ge^e>S5W9eII57Zu16eU?GRbgKTeVk9yS{iK|O(zLR> zheb?;jwGCHS80NCn=jKxgJ>}qu4l%5NPihjzazGv#J?Jcyl;<#IW&x4mm>nrW8>}C z3U@aeD~)*F(0o^2{GnKVm$Jr#aZE ztl~TOkM^SdzJapQ((!-i8b!RkVQBKkL`2ZCBuy!qI1L{3Er526plVols~68U-^9Px zR(3{j;Z9RHX^muc0dUywJ|`yyZFf=k&-Gb#m4u73Lm5Ks%BfHj%2|gjn#i> zLC5pO$2Em9H;qoKQmMtl<@wgtPF1%2HariD5O~u>8=^*J&au~JH%Ih@&2Uging3U_ z0bzfKucW$ZHSx}!#buB?+-J)%RQbbXM-!BJTS&#dU_@lxU6>te2O+9 z@F{F{Nb!;{Cd`Gx+$G?11aB~S#wIH%D=*=7f7H@D@%B1)&bF$@t3JDq4l*%(wJTlh zo`?uMq{YilKUewPNaC)GuOr<8j9&ofqRU__BRUX^x8Cj3a;a$rXzgXqW>LR#CUn%~m)t zYC&ol(gAkbc^fd`xWU&bk5vT6KbFmsR=O78Bn%t7 znbw&=c+|T&#r+bls5rU6D#HMvqA<|;)BV%jOMonkm^p$7Vcel-Wwn$=uAJv&(8W>% z9))Fxpl*(%E#wFm_m!U~2HqgZs^2vaGeY(UfYKrSHV}w^D0N6!se5Ewy)Yy-!(2

aKj2hWG7>znxs|SE zN4rHtiSPqLskWp(?(_YYwgq+1@8v+~8As|(bC>$D(atG3ZE8-ZM3SVcg|vHQz$I=!(A`k`5= zOqR>&%G)$)k*QLz7MTB9wleWpv&N9Sta64wy}3Ytd?x!Ja8z>(z~(3UNFu^eFmn#6 zw!!gUxOuZi$PQIs*ixfZR3iLyADJ z5&s%tPfk>V!x|A-;oq%1!yk9H$UBP0ToA*EDtz(^!_AnF1bBQ7joj|? z5b)gSI8c8O$PYFE!vXJ<4gebg*9G9P2wcB{#kv0FItc5T@PDNo)}Rh4Us}L{e}xzW zhwt`)j`M)mP=G6H0;^&q=I0{jU%bIRkF#uLF;{vVC&H|_uc diff --git a/android/app/src/main/res/drawable-land-xxxhdpi/splash.png b/android/app/src/main/res/drawable-land-xxxhdpi/splash.png deleted file mode 100644 index 244ca2506dbe0fd8f6a05520ac7d1a629ea81438..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17683 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 diff --git a/android/app/src/main/res/drawable-port-xxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxhdpi/splash.png deleted file mode 100644 index bfabe6871a17a5e95b78fb30d49b7d2b4d2fe4c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13346 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

VwO4Hu8X}%XHUAz_J@50rzbkIsat>4oWtQt< zIO?tf?{oTz>?^ zcs#99X^>a=*D4${xG>cbA~mO3ZB$EhO>H1&*Qy(>+hed@=A`jR^=cJ!Z`3E3@Q919 z2|Hx$qrVsGlLkcgkxI#|*OEWCg`R(Dc|W-FsVh3ffkA6Wv&KS*mI`Jy*shMmL7i+p zTFI~6ZFWUah0_YM!qjNfUerrcYR5kNd~_l?c|YSYK1lXrX5Jvyw-?I=YZ@JeEE%@9 zjRTcK5e%p8vf?4Sh{hzPvSvD(2@OVsjP%1al3iOnJ&B_;o}k*g_q;O$pCZhIqr&H| zY#=4Rd9@be`U)0}1?QdC*8SRC^1=|6G+G5*sZD$CQBd)0LT4s=)~2U7>V#!lV~)IP z(A=7y3q%qKn8bQyn==u2VP>MVj74-!pq6>dfw`-qSu zWt_c|DI&(Tu?wK=$0|DMG5AVR%fnRhsvGt>gVq>qQa-a%jIS1C(_O;l7xOdTCCy}G zdpgQnJk@syL$7a$8c)vb)|K+W-^e*><2yLWb@AY2#TUsMB(~%vT!S2o)HZqn)MBf z)}?AORn^g2%th^rZhz+$aKGTi!3gbXBhzmj%2d+Rk-s$D9?SlyV17a;D!N`yL_J>0 z))rDiB6LyF=wahV7f`<^zHiirz#5k(xz3JFDY=&Uk(aE}#H?1HkkvW#9$wiT-o{Yt zHUV6OZzYk*Do;k^-may;=hZA^=cR?>o|n#u**Hf8z=8hdNlLAD{wj_40-)Fs24)PV zvxo#<4(|Fjyy!~saI035lJ#JIOY|Q!IWLf~cK~S9MFbMBTwPVX-jg~rRILU)2m>uw z@9A+)Ui2fckc;0eUpp15 z82@-Mfp#!sUH^ef6tiN@>@in!eX92e0Xd!)+RThBIYld6W0}p9lbUWv5m;Zi%?0wt zvTA1twcT+E6@F9mi7KmaJHV1H9*yk3_~l$p#Hz=<*@m6j@bO&RTXq8sLbmIPY40^- zLZ?zlKu>7ZUJxUa<%J5xJ4TM(lR_mKX~)%_*bAD=*eWDQ z*YOO3v-{8j_Wg%>p0qDME8dN{n~0f_W26%vD&}^JNYU}ha6B))EXB`_J5EUFl=^9w zXS>>$`kCB#;;)*jT`0TqK*&TE`V!VC_Y#bww3?$HiRno=c!N|((tv9Qr>P#Mm|6^n z(P7%Zh4Vg;n4zUfbX%SjVWC62B{W`|*S2lGTFf`Ua)*Ww+WPast=FQY*$&$gS`^AP&tW@ge3GVsSaZvqVk7pPkhna!(6vsXlIzmtuPGAi5^za!%%`rg9Iop%cjweBc{ z7H6WieGAC$BIP0+!GX?)pnH~%NjF71Wr?Y?Eu~t!deImju;fD{V+{`}8%!CFbjks% zOnO@|Nuk_AiptP}!8dYVG|4}Qz69R3Rrt@LCD#a56{6i#==cjc&m&Y%K~yzjv@~=A+lR=i4=}^>X-7 zZ%5RZ(@Cy-7>!})9abu8c;huoVe3bL@fMeZul7P27`sq{zAHmuLZ4vrO}7XU#SLuI zPu&mqN;3)85rn&U5#Jz3cz1yuaH{!3nwUSj|br7tX(-WErI zH_*1IBI|HYZ-OqrGVj&PWF6O+qsQ5T^L5K#+=c_DF@OfPy$OhtS zE(9E}A<7){-2x7LgEy{&9oEl!k`JfI4XDU|98-8pT$) zx~;Oy!G+AhazhR#k!~r!>rm-@+YDa@w9aB3=z(`ryPdyy@s7SPpb*Agi1DqIfDWpt zO1s*_k@i=(TbXXAi&FoBXuYWmR-i|-ulY~bbHn4!DX!4?)hrACs~9<985~ogu1Khz zphk*H$bj)l{p^9~8mc3?E6Z=SP?xS$&84dY8@c?z=B#J+$tmm9Zu|*1RVEzrxR638 zxM`2ri3^rICyG;TggrGwb)5HP*7JLajV7BYLyZ#DwU|?^pk|#pEoNyh>Vt_Ia2bBq zqwbxjKHSz4Sw^oL*`V8i7(8)#P`=&Tm*Yz{PIhNINO;XUaeA0UlDa|SZk)%UwlW^U zn0W*fIL;)noS}=zU#l^qLMiV$Wqkmyg*y7Vf~#+3_{aiO%!eWQ1l3-wG#Ab4Quptt zRyRe&x3Py_D_;+VN5`6k*E-t`^TY*x%jgI@R(;qSTSa5e_odFLA~keDhV{RW5=p`MF`GuPop&b^MlArKeA=|b_?XN634nxovcGmBpJZ2bk6PYcoQhSGvN zScz+-z32@xSX~sd>|}kNSL_MzE|~UJgAL7d-$uS+)}K0Q;jLp(9Ci32cUx(U!7ZGw z>e;WV9!1zZj65?4(LO#tO}P^o;8Q}J?SZeDOX%T|YEXmJPY4ymP89tR!75Qr zz-*`VUja)?MAWGWMqO44`(QR~#z$t*B5t~zDeLWd$D)b?*)n&Fn}Hgi!jt^u+O`GN z9|afa=dBg4yFaQxPEAHs*;95)v*U42a?(O;A0s0FxHOsDypRC7?^pBjkULCr^Qwh+DuZ|wU!jOpY$GJ$OO$a5A)bUlIx0a`Cec%iHu@s zymUiv!Bd--1_U=>Lt0GG0}LcGMuKg$5rlX2_N230xJDyXw_`TNDS{IpH;htFsZm*g~T=o?zN1$j~IJ zcM8cIb`I$WL>idBdc2P3Q-xMsdM)Zx1w59h4~HOtIWgZw(EH6P7Eno#2#P6E-UR;S zhM{;JeOI8;+#yN(v!uyzZ&n}(+4sJ5qGVpE(&{mBFT*DdK-LZo>AEOYJX zFX9ef)gYA*An2Z5Jypnjlg0E`beI_mOG1hgY0!_=aCRhY!VV@(*QMT}So#IUy&~V1 z8SIo3k;`t(EL#@c|A0w^9`DJDUI%_NRY@A=Z1p7Go5flJXBLawU8b@t4h2H_>ca|A zT$gVXk5D(3=`~|ieLErgM2+?=lcbw8#mo86gLcCG{I4T*|8??h^9LbVZrbYGam>wN z*bD|?p|cqb|8Kx@aijc3i|B+l;NDu{Qf&5d;rH)E*8PWTpXikFKV0WT!2J&w;CCTv z{nPbN!bQ*iNx10QKM5B-`$yrT2{$MB+hm(2`d3u_ZIb`~+%(aqiT*caY+}*B^5Xv% eO>gcz4Y;lHQ)5=gT!Uz5xom8Dq3D;JcmD@1>d%<~ diff --git a/android/app/src/main/res/drawable-port-xxxhdpi/splash.png b/android/app/src/main/res/drawable-port-xxxhdpi/splash.png deleted file mode 100644 index 6929071268eb03ee0f088142b6523566b78550e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17489 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 KR&><$`~L^lv%S~= diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml deleted file mode 100644 index c7bd21d..0000000 --- a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/ic_launcher_background.xml b/android/app/src/main/res/drawable/ic_launcher_background.xml deleted file mode 100644 index d5fccc5..0000000 --- a/android/app/src/main/res/drawable/ic_launcher_background.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/android/app/src/main/res/drawable/qort.png b/android/app/src/main/res/drawable/qort.png deleted file mode 100644 index 39d090f724b9c2708a771b0208dd41266d433cdf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1907 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

rWulOx-H*Y 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 - - - - diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml deleted file mode 100644 index 90f9580..0000000 --- a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index 12a409b4fdc47c082a1a1491b7f9e0a4cb147028..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6229 zcmV-b7^>%qP)03{4zMF}&68744H>|E8o=iI8>Q(axv-2>=*f4t(mU-xuZ-@5l#C*NBb;Qx=f z1PuR2_~?xz{J%ZE-x3gAOWBO7zljAO4+lf9yoD6+`Ded6zh4^=^-mxot!ToW^wzzu zx!7RO>}j$(yMx)$1x(f)gVB-+)QCbTSWC?y1gb^BdpI0${}T4q9IQC-<&MoO=G5aU z1dBH%#Pbg9*8s$X|;|MA(KBaN=SQAT^l5QEv(OTej#a-;WQoFZ?0h6e0~nh~1` z@$wcH-1|j;-M4|dvbC$`4qAuji*i!}J8z)QHz1M})6gkX>>avJy~^xrGuCL!x>iKV z2nql}oC<-7=#P$tAz1uSpF*I_*er%_2nZIHCvSnVCWSujp^96|d zA&D`MdGzDL^!7!wLe`wI0TGOX3`J|gN)XDK!~?`sP^L!GWyY&oO%O8rt5($?-!kuu z1vmYSrvw$C&I!`F0^&BtJb1#Lt}a7o&oVjN-{%tymHK8`ukfn+26oG2-akhZS)|mT^8RP7G*}|tGrQK9_ zz+fW#qIK{|D<_jkdSWK8=vWJ)@-wniE^Al}HyvB_)7SUS-M40qN0uf6)uQ8U05MxL ze&*@{sqKp1^n>d{lA2Hp4er?jN>&gDgKu@uE1bOEE!uJu!O=9PY{X%Vl$(R!P)Igh;ZT&p4YS~zf<=6#h!L|80|O)v zncmBylFSXFE>g|@%G#fok6OR@4hjWGk`h8n1`v&u;PlArIq7qE(B8g9aB%eOUj&W- zp0F1hz=O>X4Hgl6#t;Mz3Q5BA%?QF7G=M8)g;Z>5VJA2Z4lo$epHs>vL!;MZ08#Ix zZYgH(@#@`+uipILBc-xUiVGg0Aoo*@GxX*-@xptvf=j!}IhC{;-j%T|2+m$rA|*_578K&j~$;sGMNW1Bc{*PY?4 z{;yJG9M4;Ea->R9Lsbek!G32Acuf-7WDIN~ILdzPVI%Zz%mSw+4TZ@hL6X%k(X}Y@ zHq`zw?X$U;yp2Ed%aCHEP!ABZI~R|mCIlhT4=2MlaMVTd zS>ijY?5ZVzBxwWa;ITo+P%c(W>=8)eNNGtwId++YXO6GAtN+fgmR4am-2F$*ObZZC zAsmxlE}ieScDPF~2vp9V!3l{F61=eAS`D=pR4BQ3wdA$b_UNB4jezWXnqY!{zI=q_ zzz<0HB|{!BdS@|`P_kszW1Sz?Q#CC>Bt6zq53d-S*>&8Pn0V6FbPw*bIh)?hR{naUBQu)=t2nFzZ%EY|OPbJ&)5 z{=7$)qA0JX2E+}sW8%xlUiVwtPl^|lOSTwckmQIy*l(#s$q|x*!_-6Wd{jplEGo)} zd>7^hcvQLtn6{+?K0DeNR|2A>Ln%pKghc9wkiyI^#j&5*i6d}q**|7=oQkLMoGsF| z8W5A7D<;nEl6UFMAN``yt|vMY9I`nC#}CIsm2lh@h`><~N-M+fmTrNCSLDOs)=n&f zMGqx}eQ&Su!qklwaIltaXdEN26eRpzrzR_OFti4P*(Q58W87HDY7F^G*Z)WF179vF z!>;IJ5x1`fL~h-2^YaH^2)cUQt0g@VF_jH6d8;P>8Q7UlrDExbXLIO#GhTJU<@qqN zFdZx^FzOp3VrQTH(g62vJOv&>J4}eSGtyrJ>eC_Bn#}@B@@`6_t-J<}l^{4h2Nrxf zr`J;oDPpH70nvLawv<~Id3O85j&|yfq6W`YOMqa&4LhBc;3KpN;8+pHB!u$x;2cP| z#WihePSD^N;py+IVab6y@QFI06nDlZ8em{kE?8};I7{;BlB(&=$!74JSpBH$BK)2T zZ4r;A1jOQ=8>X)sW$8F}rCx1^QwWi234W*$tKm?ZFCm;O+dARJOY@*d7DmA5a2!T; zo4&OYzC7lZuBqrtN@wI7g)dzjtkBkks%9cp!|AD_ZKb5sS7OPE2^$vQv=)C#!6P%) zN{PnOSwFU&dIeKc#7W zHKH~2%GUJ{QT;90RRb^nPy;po<|4Rqyxr?;(Atdg5i{7$QltgQ0-o}J{>9ZFFVKLE zsTr3bQc(Mlo9AAbKXmpEx{U6vlf-voPYRnVZ)82-BtM-{+zofAt( zmh7*EM^H^76#~VDxp#SCXfE8-Hw)Ln^wY+8fT+s>wJu1r<)SUJ#&|TfAQ;QnJ+N-U z)qlgEv6zTomF$me+}wT73+cW7tOlfX?SO7QB>13QsD#7m7!>Nzj0flt8rq^yN}5k(W}cfD_|_&Eq>l?;LHlWXm2V&HKX9s9Od%W<2Tpues%4< zi{{`km>r_=P$NL8<6b)Xkzi{xLMtSf#Doga0tkLL95PfuMQZF_<-c7%T3f{iEIS$r z{FKu7#KqY#t$!2A)Efu9nPh8CKXgxl7C~Ndzbd9rp!dKA3GOQ7&KW=9+!S zzF7NY$J_8Cjo1Pl5EawFO~`-$1)6|H$ToDh<9X!~V_dk=cfz&EWZ;M6{-rn7u>o4A1J&MqC< z2F7=f@9F+o(gb5ypGX>zmiwkrURs?B7ALAOGt`vCY8!on=&f1*xU(<*gvzlIKxF;W zZ+t~8#q5{VE%t~crU3}JYv8-=W)H?sRu;SB0pc2vETAz6h#&DJC|(XYv^oW>PRz{^ z5UUsINl-WxSU1B&hAswB#`P};OAID+6riZ&6r*oSFMe z9O_As0?@ZPu@V#+91iHCYqVADw*aK}PIQx#1r)}+zhP!dKWzzmso@8(r0N=Jo}dbz z8rYHLMk5_fQYqr`0P*u)x-=K2_RG>W(j+mIy-(d#5y`a@NstyCS~D12;{r2EkUHg1 z%Yq?LTe^N$)-W|7@?z=NK3B29=*Wx6uwD)(pcmVnQU@N{&1-ovJwT2{(Qf{h?y2zN zuzbjM%JmX?#HYOi%)}Jry@T~piD*jz@o~8@ow=wfQ{lz*ZIHoRxo`bb`J>f<$nK{2IgJ7o1~3kCq({7%o{wYU)V9T&UKutQFBJ(CBdNv}_kMD#tJ}Ew znt*7)7)etVF%OIG__dw=f^!xwzb zR{~->kV_rp>H`=o?oDlgCVRB)knTLH*tKooh9t@zl^y{e!;JnztUD{EW*ipSUcr@) zT_|lgu09?aN+LjNd+5YEQNOxWu)1UettffK%nt?NM z8Ka*&z1`$!)mr^yc41cTKnY@M)(DkBtmx%7hfT`CWjjo4o$KKNl3hu3{D>xxY70eUSWtEduUH9&(D&H_C zj|Ye`MSB`6jhLy~@M)W#w6(kZPnw;{YKH!vSh88pnPV%kc1uy|K zdG(5_8k!Q2R+OxH6Y;~|Wj@HTQ;|$|?eYSm-kf|Vzj}S!qLDAi>ZQ5t6InRyG3>U& z&ey%Z!C-M|&YCtX(2{dlL|epEtqx9@&cMkmNAtS8j(8|zn+tG_?ClW+a8a%ucZ@|F zPKuX`tNk!#T^a1d6_1v{XsBt6mF^P;-MT`4EmPrv%$#>K_5 z^pIPOY=Kb&qQ4_jbos+upLZ4v`GeNFHoFLUG-{-32q_fsU;tSI2U>-o(GeR!vY+Ux zUi24Q=fx|CIeh~3t_ov7D8XSd4^u6I6T2?Y#~&#F_QS6i4x6cv9=4*&N23)naVbhE z=sB=$uRpBah=F5<&b%V~gD8L$gMJVN4+K56aKhn%@>VWgNoZER*q&Por{HuGwD&r( zAeMz5%PFgsoKon)!OMocHFZBN9XaCEkzFUXq=!bP1&B)#?q!3t!FPTzIitt;=P(r2 z)--ujxRj@nBvJE$;H`s30ki&mJNW78w*;z^tV$`R(26S6{gemN%v6xaSO>=_*&Lp4 z;Z*d3SlrXp@bik9JKmf80rp9md(7r3JwWt1+r)_t7m^^OX!`aAj{E`FQShj3uvs1w zNoGmqMAgz^wcN-V)3xO_oy;u3Wl-rp1)3K?Ls zGm?ig+tXJ&kC$!Xj1(2&&>>-iJ1a z<0=%{6|ygEMS^{X+v-@O0vnZ2V|Uue42~X$a97rptpCfT((gW?x-Y>YyThMv)tpZv zK=dQ_q>n5~X+5sGuW!4dPrPe(lHa>Iv;jdY(hr>zu#7{DSI3z0kFm)@u z^4>meFMI4wqoV+KCM8HZm7qw)Bd}21*+!)1C-NjKCLL^_2YYy4dSInlN~FgP*k_Ta zesqOd+E3svuPoX0^xY-fme9T*vN`}VSksL0q$x@TqyLCoCW#8wl7T{lB^3@d zguJJITvq(a9rNAQWmF*~S55{wX*ewf#Lwq35+!LADyLj{dNzRgNJ!l%1mM!-$}Z@T zSvdBMsrLMfZ^i$g!>kv1|5{)Gy<#}n6m*~XX35^a-}9E|bU8)G1cuw2v-(d4l2Byb z+enhcJse3Bl}VgkhfXPMeaWBhv1N82X|UK)?dZwC=%;SZLNK&{LgE=BFuqWr_Lr|t z?s((%l5gIjnht>>b>dRlJ+_IB!eatO7TZ~P#eF?<`rLfGIlar}Sa?gN zScdI*XV09T!-27sv`-RasGz$sSa)P|#opyh4{u)lFIiehVmKHcs9h_1}y5a%B37T84!%< zt2rbzoY>P?zI$u&szgpHh*Dw*%vno~a$@HT5cSEWiQ6X%E(sLbDc&r(?faz_ z44l~4n$e+)B_*$e$(GsPh;<5s$)1i;Guv*4dzc!+qOU%LTiHZk-HD*Ps?=9=PATxhemLCQ^HXL;{U6Z8WjIq{oiz*&+)Uq&ZmmS z8yvrmlqWQ+qY|QeEL@8CtJZ(=c3#vd-oXD2v=#RX-A`#s00000NkvXXu0mjfeZuK^ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_adaptive_back.png deleted file mode 100644 index a05f3fc64b1194902313c4271059ac18b189eb6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3838 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 diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_adaptive_back.png deleted file mode 100644 index 3814b231dd6a9e7eac001759a8f173505e9e6564..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2041 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 diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index ff8e3910ea67e809b094dd5fa0e654fc3a95a8c0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9001 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 L=h*EsIb{=75Eu#FqaMIa=CEM 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_back.png deleted file mode 100644 index fe154c845177f01f8e8367b6bdb1b147ca90be83..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10836 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 diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_adaptive_fore.png deleted file mode 100644 index c4fdc572b720e3046d7395055071ad3f77f5033c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21943 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%0A6If|AXs|(Lu{7tY9Zo8PeK)d+O+{Vt#P+ zD%Tc@g7Uf;=|2HE#Y;m3(n?(f&ZjMd@hn9Gg@s+I@9i66MpZ3gA~+6YtXAD&f6Sl? zE8NSo65HTi8QmbmUp?id4c;BzDx|HEA@SK8)A{~IP)|I9ts@j0u22Y7wf%H^zy7FH znJ$&<6c}04hEicFYZCXsPX`06a+2=SS(6Uq&eRdfR@e@|8#~F}G&?Ep7*T`q@CaW( zDVs#4=E>|k+primgDeDsgDGmVuyAEM3PDHt2p-`tpZA+{)Za6c1)P@Sv}stM|9cuD z0wQk1mv6U&wP8E~P?aaO;=`k2zs*+dWhAS9TF;eu_onWEeJsD1^nW6j76cN0oU`Zgn#iv z)edSs<}h4$yzt_#ncfK zi+B!;RCQTX;HA2lVlhH=wj{N_swHcVEDt6sDynGN7MnT(E0ia=I3C(>sxEJhpp2 zLe|(~mhe+R>m1>$nTHx187T&qt*vddUnH@XhpxCuZ#Xuq>&p7K-Rf8LNOKJvs`$cR zjr_0!s)UsR*EP&fc;V~Q27eJDDNCi26OEd9IQX=5ei*cU;i)e>mrGxGE@)o0r4|1t z0ziF`+VX5Wyb(wjn-(Gr0bU5o`LgRuZ+Eighrtw@pC+axrP8`J3&I{g2>s-3uopi2 zcyu5FPTY{q;(cS1WLU4I9BT-(s#)QHRBc9W*3{QuZwteS0dsJ%}=UEHZ~^K0x-_3^h;H3ZVtaIzg>FmGkf`X|xzO5h9MUG90r z1~OS6WjA<7jB~to1$*snMo6~yupoi$+f*vOeaNX0!)LV7@%?;QM{Ve~uh>%QlW?I* z&`FchX?VSLID#FVZi4G1;=JKT@M5QosP?Z#yooKwT{CZF6BM(o9jINiZqr(B6s^O2-$62BOUx$|Big4_TTwO5~MvQjMyE`w{_2R!g3CS;0h_>PtdMl>d1fhKgS(ZI?sQj5r6`Q67XF=O$|Q)HK`j z_&Fl{(HKZ$DmcilkSk7!VAGocc1u(DUSN;yzRk$8DK4M1b(Bi{bV6O?J`zEu)q~{M z%ePvR8%mZtS3%Z@ZiOL}tqQXXq2tV1y&iAm2eQ}Fr*pwOgs36L1r-f3TPxQS*}C?T zqyZLfgn~0t-DP}2(Zj{pef8|&19G2^DYB0*!%!o0mV0faF&U>su(0Gb$6cJbg$PeB ze4VCnG~_wHtXIxY{f4Et(cnkv)6= z@;Ta(6<8Bv#dk+-P3D7<{o&L-->`>orR^*{uhb4nv*}V8Sj#w|@auNMXX{!s*p1DLcQL`e0t9$E^&zlssPQQ9^`~W>p%u%oD)u7tly=$JcY|wpI zS{UV?<3g@h%h^t!15qx~dmeOWsDU3zNRGuV&K5fCQ-mu)^g|q1%r&LY4e-|zCp?C= z-j~j&MANw5lS?N8i}m9U+;n+fi?nukMUjv;lDQ3vCe-wq6g&;MzrGx1X>INwITw^A z)wyT2)$dayU}h}^pKbI}20|8|=&`v}lj1TIPrdK36qhc(PS5F?bIAyNcjx+x1r@pa zQyRpZ9==9i@l^IG&YOGy9HF8;u(8|b0f z(<{Q6dK3*MB{KifR&JY#7`|FnS}JwVZQF10wsiS2j`ksAo#mT;qIF&VjNZuq4e~oJ z>8#@PZ!+&_c=RA55U-vDZ+Gb8zf;~Ehq6TcoKtXl*_VwIKK*6=D+NUBRCSOw?y?{@ zbbA#zp})$RYYY41i42e!Hj?QZD0&AH^P}X_a0FS4%q4bG8Z+|&_il54w^bH2)h364MlFPC=dVI$6os@zE9c7|MBtRG1Ic^ zi`5$9IWC@cMBW2Was1CZYU0mJmaQdgmlV>B5q`6X=%7h*Nu=wX$a&j_baapEt+=+z zsw#B`HoSx*bq7Bu5U1@z^XPAPG}++F5)TLNxq4TkzFq2ZR@bQLzN;^0mpjb7Q~MWmzmk6C|h#8%m6K+U+) zvcqB3aSTAhw}y^Ap&TWDo!3rdiR=4Q9DV|?rDDi$r`>N_-mhh#N@p(S{VL!@A=7Ms z_Nd?qt1DeCra>sHw#sf;*imdo#G(cW6{+K5sD0p;_fQ(o4%JQ4n8c@aq_0RX!cApz zpnbu-K6#OkC#@H%`WB!!B1Sjx8%|;h2dG>K|7!J_LGy|rmMa!(wJ=HLz8(2)DyB=1 z#JnIMDd2*5|?kVpI{ClouQIF)^> zpgAmvE_9)MAxX@&Wvk<;2E4TXfJ})|H-t{Lm4GsR?g~C z2W-Y8c-1G?a*qqtEYqi<)}p3M&Az~#aldupoC^F1QuvFDXR5*XbE@tsfLy5X&hsL% zWAZn1&wZ8U)}I(6FQlU8F&$6 zX-osZqgC&;^-B~JYXr&o1eiGckS0sYxRcfKQk4o;Fv|~|2^|q##{50evFC5d?F>cgl zX1JBT=fF?N7WPJF{QdEr*Dfzf0XePt-q=lE!kmYn3d)LTCTGoW4Iw&wh9pO~;)7V> zXV+@?SCh@+=CReE)g8x7cQUG^HiuI%1IBJI(}ahPN+^|df8!~D$DTLIb1(MzWQQ=} zls^ec!v6mC=6yLx*h>$%Lb}sG3RaQHA1C|X!BP~88oq{Yn>5R84th;(QGxShVYeer zke^4%R(Is6(d%s=a9PsNH-wMj-auPGVMx94#1z_-vxfp|hoT&Lfh20Gvft_vK1<$0 z8=Vn+;lw1Dg>E7yE@#8|rzYw{sectE}>qFug_x&RZZ>gT0b5VwIO z5w|T{lq{`J>gi=ZeB+`+P^P>?$cr@(jcX6@26JY^U%d#Wbj72;Z79(BI7ODNKg9Ha z(IZa6|Dg6?Vk|@yh_Y-%?sk`Rz;#}-L8)#p2V8Db+zIa3bWVO3IB~s3g%QfsJmfn0 zL$vNa{$H-TZ#DV31N>I55yu`&yW1}D{OP-B2Jt6++RE7r^_c~@`M-WcVhW9?EUx*J za8A9lGVkB+G87H3RN`9DHJ27pglGgMhPC1LyVY9XRTxoLIkS^w23c{!S3xEnAfgp< z$q;C&;!arK5q?)1RtmW@=L-SxmrG7HFh)3ETrJH$Y<{piZ~x`v4f*$s7qM!!Xlx?} zZ|_yzV_sHPK;z2e)Z_qezV2b+aVuxY&%;_*A(B|_Bh@&1_}>UTik?Qp{~^hM%WGIY ztK@pH=K!A6iIVYln`KOfS3s_5uGBej8>X)jO+{!dm^I?gL9!8{T;vgjO4r&4^;=uzzUI3P2WlhF;W(=4eA$HS%^F-$8$&|)4w7MuRzHd> zH4ii+>xS=lTU4Nnz)K}wAmhkHr69FnkFzkU=eM_8i1HQqZjlFhNBq6oSky>H4E2#X z_@SRg_7Jrz_37QyV@F_5W~NS83APX&u+n*ERAxqM!BT3K_`r*GFaO-Mz)*iRgeNyv z7*>BWnLyk8eM#Oyd3y3=!oxU&UL1RpVzFq~9A${H_D?EB%*m(`Dsx$ORKHEMA*T*s za#zaYWFnG8qjO=06h25O8d$8=?ucR?iM$Gjxp z@O3t!Kccm_*ft_Z%SV-hRRmhUK#5PL>JW0XNYida<5^lM?@Ntxe=lGqdha^@uNrk{ zXd^xo=mrw1&^aIscM}El4aIU>I#2B{?HLNaz_{g}1j|U=G7>VfN2h7Mqk znO)%$4Oc7YXw{`Qg}&=BO>y*zWOQpaz4ekp+lpThYiwXnAtJVg2pZ9wC^jwh3GQ5E^J1F z*X&oOpKat|W#CH>w6pjA5)-$CW|;YjFb`LP-8vptlI@U+e`pt!MQ3~O8r2R5`ulw$ z=rop2En-ppyHqYgS$dWAJDsPo5L#JK1`Y1F3`M<@%jF8UybbE}z~|I~U`^#-6*TX( ziL@g;lvJ?pLnenr+?3Qf7}&V7TZ$*Bs3XQtrtu67tQVuDyeD6%>aEtPtqi;by!_px z$1t60D~Bu_*a?*7&-{3MmZSSE8nEb$2e>jorRWihoQE>9R88+`xwSm7>fe)Lb&SEW zO5RtY$liqm-%8vC3P;wIU9w0?_^q9p!{Q>xt~B1~Nn_q-f*SGuJA>7)g&S2lbV(t9 zH`&Uvw=2JrK+m*WG}};Bekl@SW^4BuWbzH!zc^W49f%8TgS4pYfUd+(6Z76zIIQ&9 z&#eBV^2#mx3jopz?l*^`fOX%DT_hi5ne{8u*1+q06hDoj3vd#sW%NEiV?8^MFCW3J zCiV^?Q)gs%QN_CuWX|2Vu6}#_{0G&)?hnMHl$NvMK2yVOaJK@l7uqRsNAzn*U6yu~ zrdJMPw2ofkHGw1BwN- z=;tPcQY?;tc%^a-b8=x!TW({Tys?9?06(sHsci*=fW_+6(rjEfCFn)(>eYl`RAI}1 zqY^o%e@XLsZgCy&UFb*g1O{N8W_4&rABc=#SrnoDGPaCPg~MSS`!7qa&%kDICX9cX zH`2jHHD4Uk{B!Q1Ig|KSCIG7TLuy-4$*KM~K?lS?7OT>=`otV9z3tW(wdyku zCNJ`Bgn+=d`0u>{DL%0c=UR$#@}hGo_N62teeycev4=tGYngAD3Ll* zn!MWd3=H?iyqsk+D%DP1myJvG9BKNEsjI;LpUj|8(NE+bAD1_)|WrG`~d#L>HqtxSfy>{ z{+H{>sr`!~&knoDs#Uj?dq>->#aXF3CFj>tW7d*AALv`mWXU$1U>Ul0tH3W+(gDVi zzl+~fDT;7X@@_lz9pB%0qINHH2G;MGX_)#INaxF*W^?HApOzc#nzxzKTJJ=(zk1T) z;QYcsImASd%xcwc{IcFqM!uD`xJt^>W7^DVxqshQcFU9jQK;l5G{Y}c&86R=Lh8~n z%?;ONN{o_eP19vNE$4?;im&_QHn!1OoUSP3_izL&By`E;X3XL?-|7@z#CVe{3DspQ zzE6rJZsj%?uH!N?5sg6@hi}X1tHCnLd07V;yTqa~KaJc8>x!K^l5WIeM}-QwD3hp= zhFsE!!BwRfVtmqLGu;w!l+%R4CiJUREUW9cq_)=_eTDl1b$PX6WZt2+Y3F^(6i2Q+ zt_~#T1ko)2j`mTULCoR~I}C+)iRCsJ@oHE+v0J>#OTehA7ev3chlkX>U}D6KPLnZK z<>5FBfUceFA`b_jzY5?%@^kWHs-{FXP}w zn((jCQQ1(H67iP}(Tp~2cu!VZl$h`PX$73V8m<2Rmy|D5wC~>zvyE$2Enm1n+mQXB z1bQBnw4&OG@n!iAg~;z=9MD&$jIzzjhjfS@+q4v|5c?~j0_snqM6bDbfkaBouwlwW z&)tvH@ej=F7X5Tme5x^(|EHb%@MeR19{}E}nh9PrwM%W)RLs06Vx}5<#1<8+RU;^B z6Pp@Ulp3)GRkKKI&xjGNQls{06>U+g{iWZ3;P(%_f51KGo_n7AoO|zcpU)`DIs2#i z4I(zutt^E-wGvHq_w;h3qVbaLx<}4rsq{PNTDj0k zXk|eQ??^O+5^QMBa!1mx6K#x+e2Ei=ukLX%;kkQ-s;{Y0hQ-`yDHmZ-PKC7LJtE6K z%~q8H1^^38gKzOZmEjK>Y(6_FI9O~f@IIjmdRF^5E2uL6Ua#wk9Stg*D(}g{$b@pi zOzsA2GuJwzls9pGYUK;Mt7+ZO>F{hXvfaIgqqUWrFs>xw>heO=Q*nRAxx{7%@eDYcqH86;kIHhZsonQcdIdFvyL54LD?({)2C&R{mzxM*H#Bka|;n z!It7KpkQ!0C*P2lc~BocsBzcF<5@@DRlb|8wcYEXHIDEvP;o|sekE=0aOhlJ8I306 zs&OJjYv$OE7Sl?&!j<;bXE)5pvUBf=A_n;yKn7+i6Lo${_*LfPm{Vc??Q;lc|1D{h zM78HjA4G#~USpUj(T-r18@_O8B=2&Yy4u=@9FlK|L2EPig6{>IWp;`Rv2Z^yrGcjD zi7hVfK;N8spZD2p`j95vW;&`(Xe40`Xk0DkCE)1booIIlsI9=|;7-E8RE{l3Fs z8R|z+aq&uO`hN7~*@tI=pA)lbyhEfK-!!8x7ki8;TOpU1LxdEl(~T7KKb>_pZN}D` zYz`ki=K5BlGUeLD&`*agN#Fs+&tmQ;Ex8CW0$9!$0F zTlCu6I%Jd8^2?6=1lYOC1gXf}`J3B2$lE;W*Rr5ZU0WsiL0`>_a8UJ&k+gujFoJ8= zTSnbd^1p#10V*LNEG?}d)F9ib`ih8Mh9xct_OOWrb72ha8ZP-?7xWVui1-eHq;rt4 z`cy7L2$|Fr;vhn~@nqfk{%%of%sL2XGW+V%$T={NcJ8Z15>KiwP`--0gqs=QQ``||WErLLFbFxeQp@)*(2E}rpTkKZi{ zrEVR*_rwjUB2Z4Wi9z~uY940AD#b9Be@ZRNQQ!K>f~3PzYtFO7xjUZ#dOcFR%2wk_ zf9N7a7lTd#VGcGg@XYNBjSOQbplQmsEokOs_e9%Qo(A=s2aZuQ7Qp4~xEY5V#tIR1 z9nIJ@&FvaSiyDeU?Qg>5{h#wjTD2K6 zFx#2TF~1WoSR~wPI9p$xSVHiOcwU}CGqK?ghfiaGxgW$KfQLWXIvkt?=gdjJk7bbw zm=743>veGtCuN2)DTI4ff5CY<9O!40rCej7LGF}q^LZ~v?6RX|yp0|D09LG~f3h}> zc!Lxsf9`5U;9hz=qD2f!!l-YaEUrCq+TkD3>2U-%T{+-s8Y0t z^QoP5M$LO-)qJUX-BE4#w)Em;=a*!F{w>|Pp|rN23f0(|fj@hXIgcM{~ighRYzGK1dVO5nbv9pu~>e$h5cN|N|~z$B&n5o%6a%~MDn_o z&CQz~K{7=94tBK65_RMbCt!_9v~~(#O1esCZmslSByT#Csy6PQ;9c*4KWL@Kv!`G7 zYbsVQ2p232xYZkQL4!jf9*s%y(g6m5pZw}mbDrlt&ncao4_$PN^&D#|D?!Yo`ca4% zmeQtR+P?U-&8H8mhr;P+yXod{H;XCJSIZ%cplJh!mGLCox#Z zqRKCM9YUg3hKAzV>8Q<=SV8Vy>1wdJB<66Y&rj1y&yScm0@a9eWMj836x`n$SE`eI9J*&k27BF~v(r&#EQ zC8wwSx4T`BAiZGMG=pylqB^ml#e$R%WKY3PtnP^vD=|&3f#+(lTXJKy{_-SuBkpoV z{pK;#X9Kf-Mdei-wFAg%-8@bIDc*i6SZ}Z>s+UE3{J?t;Syqn&wv%3B-!k%WKv|yq>-_y?4n>D>;sPcX$(UqGRCj@GKqkX|E964EUo!o3%Q|9Sa$Vh%pGTyP-(2J}V-M{*U{SmTkO%vSi)6WQX z+}9_$$&TVg%u=IEpbs6-^bs%_=KScLzY#$9i# zL~ZQ)kWsxHbp8r1bYUWJy95)kr(A`r6$?91LdH;Q zl`toL5}lGblg4AOZ^l_4OYb2PEHYdB*>LC2KG3ccC&H3ZR#7794u?09vyM7W`FCAd zO-qXH;{kyZxQplBxeFp&9`D5YmI8F3uh&^4nP>RO-d1(#2=fY!7q@of9!jCPd9ZwtJ^BfZuZS(7H`ll07fa>hh zH4D{+Y)3u6Aa?HP>_RAQ9}>P$6ATWOsGr#cSLPLCOyKvbTETqc{%Fh$?NW= zu5{QA+R~#{)q_;itcXZ#FSQ0RCM#a!(LZ_J;Dybq&50}NPD;v!^-ax`SufJC#iF2s z@e#E90ul(pChwBwJFG#BTotA9LI26Z+N)!1z|n5Uhz=;y%lfeF7IggwET{%+JGn7wPrnA2h~bEeoIh=M(g2IV7{%^{v>os4EN zh{gX7oRHQnI8;*W8#t!Rp4)$X?n+e&d?W8&)jg@CT7~WH8|bP4Mjr;z9Tt&$;S?Uj zVYISyGK5lPTf9rKdkJZpy!`!yg9fGcp7hN+06QV%E%%zA@{;C!CO+iX-z=pVvW zPg-mqs)~t0H76O{fEF~M{Wtx3Ll{UJs)e8(`Wj3f{>g{JMWo)%BeS8SN@&DYsZAr@ zX!IaT+@W_C{7si;7=@?ylJOEa^R*81Ia+|>iq-fF<$tb5*Gd;VVVFb*Q)cVhE z#N-gYGg>}T$txLeat|pi_SF16Sy>{vD2Eb|&LlPdz6uMI88N@li zJesR1;O22z>umay(|s&gO@>iPYV;bt6C_kOlf=kvzBhbPsL#lUdt{S5CoZSp*GqgfmgrH z_KQfu)r&=gKUqkX>_J$PDjRs~s!hEq09AT_jm+n>%j&ghNbyvKQ zW{AfShfOT&biLSLQ4JWpVk@X89?9SV?zL7?)&!z@{=MMFmEQUo z`*P@wwwLAfaz?NWWGFXO#zaxZk3;;knJ$5$^s~)`gy7sQt&xPR2BEifo%xc^W%jm5 zl15$Iq+kxco>s@Ah-YD_vIi}wqzJ=sV9k1Ctw8v@A@(8H&6~3BZSC&t;^k_+m)5)< z=trV<=Ci$$88^)%hbPiNVL=bS*Ze?b77IHRjC{A-=I|~lyuIIMxNdt{4C+CW8s_?+ zjVLJaw`IOq)*+gr6DDd>V!~LC&GIi*_?_Yw-WHJjA^+DZ6sK5)oZ1i{5sEPQ-;n=S i?7x8d|MttTKipUP@Q?nL^r3*Pm-Mv}T6LO^QU3>@uFr!2 diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index 7191d0c4d0b308e4e7225fc1eead6e69dbd895b9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23027 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

F 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 EKLs;)zyJUM diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_adaptive_fore.png deleted file mode 100644 index 69a0eb8415ca32dc54ffb4b1aad19f45a0ae07d3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34387 zcmeEtWmlU`)NUJ~MM@#KyA#}sySux)TXAcU;tQ41 zP6 zyso3Gnoj20`sy89!`TLFq}b$49ENw8G*n5wZwSH(mBzV9D-WMa+tCi~Kdb6$>-y-v zE&Z|ep`Cg4{ocs#Wv)ZMc?Q+MsB_8XAyK;eX~I2 zR+;EW$FuNJ*`-w<(d8;*2}Bn7SRE-=VA(l&fhOIkCc$+1D6ul}hYKJrnZL?rJ4F`9 z7HCLqW^H81PmgU?v;Ym$sxs;w=5M(Y+lutz1<06wvK2*YNdRL08r9?VubSG9iS8ks zW}L6<4;1OtRkHl zTrfj)63^FS`@s^w8_N!$le4O;bH3`(far;E>K_MGZg6CsRqiSvX2Oh?oLj7m;^XFw z1{bgV+E76F;!9Wj*h|iL4sACD@k*#CK>{vqD?oNmkuk{3*r3bmK9HqD$Qf+oYBe`3 zR#+gCkLVEEEha4|e;Zb@f&H&sB#%jmY*W3fV&|gLgg;+_tX7wStUxZ=2zi)H8@FCI z2}e4e##KoN+r6O7U0#8PMxKVo&m>{nQx!yV)@M`L9X+%-8xhL^Bu?vxzm@(bRBqK4 z#4Ew2=%Hj2amk!#h=mxZgh^|Uyb%tRlZ3%rN4?{cCh*7_c3e!i_xK(xg-1fy=dYJr z4K&#z9+iLnaZC?yF*)}?6f@DTPHJ2aMu zA~Sp>ij_|mKswLX!Sync8y2b&#=y!+neD5JqLZ2P4OB|Ep?m5Ln*pygPn~V64)!-? zU=!kx(=ZiTrB8TeIkC9LeF?*a{@da&yIM^(L>4@1oIk2KQqlTh#vZ71I92%p;#%s($6a3{$TD#hgup`*Q7DDbD^Df&$bF zqxtb}beEFSFR-G*AMFs4^S2ff4UM#xbQa8uUd+N%f?=^A#9*nTF~_K#fU(_5sjWSr ztxtNvFvWko+4@6DED(iJDC1w5Cdw%UC+~YV9=5DWbnH5PG|7zoASpGi@f_IHIx8wH&6iFQV_NIc{=9$P-GUkK%AppULsxdVOEg|h*`zlQ>Lq>+C?)f zfGJn4R*d>+0$yrE)xoP`Rc92^z$C%!^D(i*6#kSDg_eiXihHnu#Ec#NA<7Pm0?KfL z3#=d-6tR9+h|1qz@St`{iivq-5B;KJhn zH=}+Q_Cl!NC(z(fUTm5i9k+2*PX%$^VsPBP-D?qgU9hRh)-XkNeDWglsDooy?pRLo zZQKO4kDqW-jqu$1Kru6JVhF8HO}kcYt)_2h?r-u(oa)=9@CGr9JzhauS3O^w7Dmb) z4n0TcXy2P)a>!Qn+k)XI1yHbhwn%{c^X-&AFdbJtMXhh&U0X?YWQ%5Pk7kV}!`fz6 z!IFw=#WJw-FY-=~m{Sj>DFi4-X(luL-S2p89&a_gDS*5pMz^L0S!=$j9JfHHz&8h{ zw(Pw=k3UY6@|he9^hff1dSq~n0i_>v1daCA4J7M3#{^$ntqZtw-@>YVEDXAL_Q1Uw zt9g6FJ%0#Ipp!8xM)$+ z9ffULI!k{+8P)l8XYmdb8rJGU1#M<=Jy$(_>XK2lR!nK3Y8Ah_Gf%kl*OE7Qhi@b} zU%@oVdyLigWVeP&^x>E(ctJ$tK=f7^RMSp*WO_93#$wtY%w_Z z*R`m30SiJ2FMN5bFj|r1-6%tuXd*u4jkEZ6uE?8QD&eg~>bt8_LwAVqr6_!VGX#S> z)JM1JapEm-PG*3V%=p?o?j}-2_)?#tZ0F@Z7Nma%NyORX0< z)W(}zc1(jD?^d-5$#rw;)Fbj^nU|nyvTr41T(83TIrC>us!-P~1FIneJ4R?bmptn# zQF^abRhSfyEyOU9V?@^OF2C+f-ud`Vcj^()4B#1rFL3=9wXXfrvnlV@C==QqgGIUD zA-3gPwR%XK(imIK?Gzl5v6y%nG~#8O;5k~PM$&taj_RC1uEsPIXo?X!kN`07MH$q_ z+yL2=46aQ8aJ3Rhi>A-`@5VVVJ$i5gq} zMxfExoIG?nJEl`L&3qM;aKKQgc8=H3o-xofI4TzFC)Jx-e)l=Y+*un8gA4o4*wFLu z<^tz?`jS2-)(GPuVb8Wi1$QV7&V)BVq4CQTU z%8Ba=&m!HYC*4xpp0oE+!X2B^O@$_)fenCnf@yd9$gAL<`jPyNZ8p)&Pl=^SCldEX z70;p}wURZ?hsmMZ9kXKl=oIDEnR-Y6QdYx13(5bsXBzW2eL(qTGW*xb)O=p|unjUF zW{2`Ol$)G5TA0Qjm33f2O6cAb_+21>9OFv%`JS)FmXf`B;Fy#wkO%v&pN#MChYCJx7y~%amA&7 zd40I_?*gdL%2oH~f@8z(_o=JbYv$o{MaFt^fh%JIZ5Hr3z8Z5~2dZT_xvCv?TqF0q zxJaL0irFtJ*BK+T)r4n2JTT~3YO%00*BUCBkwJt6=)qDhGVs$)3zFUmksX_3ZOgNa z{?Uk_0_;*cx>~ZBXh~Iw21iO~-0*4a8J|Qq<*$tmiC5XzBy#n)WQTaYIYm2$gfktA zW^cPUFr)=rbQQFn;~k{EA_uVz=9jwBK!QVw#RY>0E%bgMFJLpy{| zJu9FCIDP~|JQTD$z3{jYwZ6R?rt{e^A-)!YC)1mLXFGow+}&8IMmmuUEs<`BOuxL^ zdE4C#4;)&}O5~Fka#>9mVjWOwpxq{O_0HR3BYc?34L7tkSsaerhDfwT{`Jn-J za*aC{lu2r2K#Ufax3?)n@-^S)&6y>=Q1qfWBd3>2Tmt%N$TQ!72I9bc<`Q2_VoTgB z6k)yZGJ-t@(ZxHel&yIB=c?21$ftFiO{9YyvgPMzqXla_{fTH4ytKR-0s7+{P$eJJuOogXr`9H}@~n8(nKu8n(m`7RPoWfdyc zt>_>-HmQ@-r&fHAbOEs#K4`C}$mO8?yrn_xyzr`qbiKSK#J@>PJM5TnS|)L4rOaOl zSt-3ed?C{4YpNdKi@-u?Rt>Ud?pj7;N@sGMnJJpGDPx-m9U3jzi=&AgZ%O)xu~4Fe zP3bNio^^};vYYzpbJSLUX5aA3`1(1E8K7ggV=?{xXv=zQi>gt{tMiDE(i6)c)MM{>&JQ7sxPlb zO4@G?sSdRirHCC9QYkLVe^H{92{$jFf}hp$K6!D{sRZZDkDBnAF^d9jW8qnQWpR_chGJ4huc#)1wq~;IZtvxSPq% z%`-_mY3umQ%bA?9k>ACCUx=qV`lCsl6+qLBfQu3Rx}nvIDob`GWnD>LJeVQTbmp?j)}^UD4?H$ zZDrNo-m>q+Ti`n^89d>JtAK(m#L)4i4Os&62)z_$5`Q`&Z{y{-nR{W+s_)}8j=q~8 z{A`ug=Ths(a5`g7PPYg9>CIs7@yGeG_sDkF-4LpUPwgSoJ5uOhGwLKbj6DgA@7DYD)N(p7`rlm$uiba5w!0{+v954j|Qi^THgtBRWeC0=x{I0ZFr%25_hyf0ma7`*sN$%R+b9Y?V}y;qy=?vCY85st143? zX}8aQm#_L))5TH?L-aQE4w#Q@mN9|AeR!R(N7w79Xr-81D(Kk-sMmK&E8*|`U#!({w7a!Yqhco$a zAPIHi=-?;Jw{-09y%h+vt-f|n<3?(18*bpo)%Zd+xLNGaX06^}!M-(#7#rnQWWvZ7s?2{nYPM@6L1sGsfe`^F%+OoH9b*DQBijaaY(|O|chx-=SS*ePKkf(89JG4{p?g;hRW$~f_|-oA)93X8 zoTW!eb94H;GuLaRXC5Sa1HXR)+ANQxE^ECwRM(n4Hz&QPQIv?uPsyub! zx@&D(aoF`?r{@PoI4(>DPd6Y<_p{br zf4xDEp21)I%0qyKSD2|*DF~{sXZDAFYwMSml2L91EidW&=>C3+C?}?h7y_qM#5=+n zUO|-6gg?fUychU=+Y~xVQDxatU384+;*59!%HPTP@d(;Kd)1t3Nj>hIUOBz)=DSF8 z@+65bD96{Ns5bCewZd)JV{P)g6@hYh{USTNHL8e;b*j$bACbvKl#6A9?mL3ac24|R zoyc*hc{CM)WK-zV%j-In&AgHSI#fT0b?$rKf0s+(r7Crk!1Y9tz6AH(mtb!-O+|g; zCcq1FV@{4u>h2L={i+L(LpQkyOnGQWx9KvL#R@CCSpYa?<#h&*lRb2(x%dU>Dx8_@ae*NgF} z(t=ZA$c7}*Aq9I8&@(Y)f4S9kkgRl`9%nX7HoENAv2FVyM$I@~2G-U_tE|M;(G4h8 zttvy08l$LfLVr8;HKe6CqAZq=lUPy)Pv2Pb0>#~%iY_6nk5zfF&nu8OZlc7J$$MuA z>CNY=x$BaRg#^b{3LQaKnL{c0m@rsEwA3*Y5QQA`EPAFcAGr- zzYdwKs7GQ!b=a01@o<$ec+_HvnA?s{oWyZbn~2S2u+De>g{Hs9_|?WktI-$9B%;MK zRH|i~Poh@|=m}EaA1i?z>=4%Kg|(Q2kT5H3-&J;;_^sZ-Hu6`mbaPXXMGsXn$-eSh zFnl^MdU0nP#Tm(JtW}b6@BN||=BifeCB`d?FvL8>w|COBI90B= zS)fM3MMf?GeL;lz@oA#Ovm!FJ2u*)oTeXe_F zjM>9>*0{Q{jn21fdeHU|-&64JC?YUNYmr4lW*MTOD?w6eb?w{$FgMUeEa?l zYnAQP@_b1;WO2!WvbpJ96A#ou&ys!EX>I>*Xqn3IsS?wt6LIKiDkFV|A7_d4c)7m1Z{9BKUsevF8;|v3W4f#HTM6b6fbV=)^%a)6=m0 zSH}GJHc8Z%vDyNJJV?$DYO}AM8hvS6q&gx0Y8`}fb9AE)@3kHB&&4+}I?2deB&yZG zSGB(a?Ra0jT)pt9C8#W@LaFov=|NT2dPfG)Uv_qR-qtmK1+nGjd$D^k?_oLUk-Bi# zjbwi_iDHH^jdqw#6!7iTxY#9 zS$|JfvzI@M1{NvXn+D_&RkY)$HsjXx#>3r_&)X?0TOL!rRT6ZDV#kZbc0OtVLw_`j zX}6;5=wiStvGsWjD5n2`8}|u}lkD!m`1~Agyy2^g6rA;aGIePA)w+t94JCu7QEvVX*0iZq9|D z^~UQipJJx|295##tB>CZWqfl;?c8^Ff#5xv+`tE!EJl2^16DGsQkf3dnE(ZRu)+E0 zdWQRUU2)7se*SD)HY_`}ZyfzjJfZmpOkIV<>GK|aUey&C6a-6b%fBU@`UEn+V^!ow zHo0*kiKXO+S>1F&`xr3qIjibL%5Y`>EfLHQ*rB7p^iW&G81Za#YO$o}QcD zJ+u3+22;g4+C??G`#{XaCpSV3T5AoGb^}(`olV!a0$DMa_#sDg> z$t0{8!l#a+7(=A9on%@z__E-O2Ndn2-x8{?)6`^ZpBfREcXSlO4q~X z`sMEMhKQ&O8!QK!8xoaT=<$RLhvBopcoN874Ow*1iz2c|cR0nLw_S*_Dq8pVdUWn} zv^ER*p0{3^Fp_m~BwjXru(g3PT2$5D_m;b&_{y;9@%KIq+GB}w-LN%idpaHMMTE1r zO5AJ2PM|G#C%#>U@^&! z2mo5m3ljDl5F$wohWkxDjRiT_ie}NW^8m?{)nt|82TiU=6CWAwA2B{gABCyAU%z*6 zoQ*0AL#cu;%<|X@UKx9#fBEQA_8+tW*6w+k;rae`PoT+imskpVvLH3@M>|eb&TL;Y0Dx`%I~vHT4|WEtFwH8`_&kz?c-VBj!5cW@X_f)Rdu%A1s_#}=ZFCdhweQC)w9nRcU;9;S}FpQLH%3nC1C`$McLUu1t z1h%f+`KD@M>Xs6>1s_a%_co)ayZG&pwa<`kkhL~xv-8qc?%Hz>&-(CyL!H%F5tY^h zLulSS16esraTimynb{w!%)ieE4M2T0$|x?0+lZZ0QfPY_FTS=c-AL?wm)%orY6K-B zb;sD&aHOcd6_DmFUH_K!Ya;vVKi{8ICB2`cphk-a6i`R8#lomYY*LoiOpzKQm?o$# z0+h6|{`5T_V+dy?zOV}jb25K_If)|>C_xjzGsLD|^c4ne{B}RPQ8Hsa=>#eB5nVJ< ztjB&x`ucu@RIVzZRnqyy3Af=BkxKm(D^QkJL#gBA-|rtT^i8bPdCWK}$vBKx z3_>m5JA76*AEJfli#tdrk4B1_XkqoAaI2{hN~Gq7Db!68=@HOK`{6R?Z6TH6VNeOr z0e_Sfw$`KQIYh^OtnYYjF|oz_Yi;Q>b$P@iE5$2?EO2=^fAZd6S?Djwvl=nzS>S z31n1e>xv?OBmf+(xp^GZyLkb<~D`siB=^%0o&-$>}V? z)Nluc;T*MG*5UjqWJBg3f$ym?KujDYfkesrPak9B4&&9=I5b$l z!&F?PQPZ0Z>So`JZQ;B}C%wFS}}j1uX_n2zSdJ?V)SmO$P? z=+&42rk&Ls&|g!N57rfFez!RE{i~NP{rf{9F?s&xVn*Erc($fg5&tc%nTMmD8(Xgc z0S^Ad1?Gopg1Cobu8PY)mTufe&N&3AmTGCX3}9CTW*Den;OUuZX)Xp{yUl1-nsbMSx5y&WBW-+@~4=K6lpj00*(aQ_a-6;5tC2Q-pq|+NuX? z&*3Xx*S}&vbWgQlZgra1#H6_3q=7KEQY^OrR!e_91=WBzPN@#A7{Krt8Jv9k3uDH? z(^Jez{E)uB-J6QRk8!>YP_A_Lm3Z{M!_qP1_7g7V{LcdRYpdo5OXR2$3OfV*nberf z=lJC0sqHveo|h6ZTKdmTc^!PB^DL`(x;TZN>g6);t0yJ_nn2u}zvq^(4e5385M%Jq zbk-DAby&P5H*3DRPg*ie3v~#xpm~WZAWNe!(tC zY5q^)7pq|c)kBHop_G1UF#MR8n-4OSD+ivmN>YEStIXaZ`#DL`ID+#bK18#?ZxNuDNrP2fw*58wf=p%Gj|1q~GraU< zJXw-5nyi1AUY)N>jZg}$w>~*#G|s! z)t-|1dqeXG?>K}BTY#roX{Oz@1!DS%LZ^9s==u=_w&*T8#RlV`*m0$E`;BPI%K`S1J3!j zBd-tnwkK>?y|IZBR$jcLL9;;BpQ!xvkVpcx;yEk)Q!SFjM64uoIGwymn)6fynYV!n zQSVL%1rnd4Tq}95XqC(_QM|hHr}cu7psCux!VsXM5`C?bqf*G+`Py6`^H5|u)?4}s zgyO!R@i+BOLH*nAs+VD=i}~D*C#iwB9Z66hK0t;p+dGN%=zf~eo$I1#VPu&?B4a5P z7Wk`!zN-0KjcL~y!97x$g>}+Sftf}3%%5Cj>5(TfI)`KAj$y6_{$-Crp;^u1H$vEu(v231KjPcTOHyIB;u5ODX3N0Lb{UWd*^&8!v{1dN z(j|FZ$X-zCn@I~7DR0{JKt$Y^uS#b9gROc#P^X}ufQ!E18^;@lCTG{AN3bBUvD2f@ zz_f%8FHBXjMq)V{%5a-WbC!Ba0j8#XV)I_gOTa;w=rPE*>?=Aj>AVG%cu0H9>1}L~{w@h_)$FY(TpY%qQ z$RV=z2$X|I$5P=1Y3C9KGMz1)`ZLDE;^2q+qnno*!(tELM7aojqgE~Q7wk13IJ%ju?Jhi-z%RUh^FDjGKJ95gs4f%03S9hff#II1JifhKg1 z+iGN~^)L5Esp?_jgen`KamkfecR0U=_j?iG4JVmfwTcawq(F*Pe@PTnlTEY%U8a=f z+?%R-%Jeg@pl}9B*u)@PsM{s@KMTWV2egX;Kcu;{v*6|71IvnocZ zhE8#+puOMAr$VBiX2@UkMkRRp*E{sgE-Z8iI)J&))7JKR7q+PQp$4IJIo{;c%eq4A zzq5K?HXU4@eVX)|ZE6kH{*mnnuOgpQoykx%td-EG31O%l8EI{WU!Mq&gK8*t&TyiX zeh!tbNN<>TjSN}5e*#_!g)IOdE9W+UNd*(?;LmLneQn|lZ%eK3o{`Z%Uoo?9-dbW< zoAan2a9}{r31^ZELRw%<^K-wKAyfCDba1r9^j7;oC>(H#Gu-@p>7Y%P3S|a7nLdzJ zF(5ZexwV;MVY6i_97LZNm2fj2LmonGkpKjUm}WDE=2WwnVzdkWwFG$DzPD-U-j~PI zGdg&oJ7U(++>YP47{Y6+Zj!Ec3hpSYdBAo48w(=aNt`Z#au*Q5k~(c1i9;>WLDhnk z(~C3u;5edSxviuIOsevPiE3<8sR|Z0iqhiT9k8+I zUhVCakVd%J)`*x{ zA&Jf*IU(iz#9B*mJu=th{dI2y?>kMY#JobD!az?xeG4fie<4F`r3qFmd`ha7x0Oz| z0dkYJ=oH@cvAW!zbkfH()$|%K%R`K3S1H)gaRpg3OpmyqsDjaN{vZq=Pb!{cJn!+l zKT1+ot<%dT8hORc)zvNA|yq~DDB{pL{7U9pmrW1@6hUQs`p8voBb-u zHn=GFVy&Ezut=waXbb*Z3@1sXxzG+@tk9;NP~M8Scq@swIA|

3<@7gem61=*2I)2g~$iK%)C&jJmM7Va)ZCB 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%0DnM+0SD320Iz{o#1-t~ul;8GpIk)Zu2T4C4M+Rq_ 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 UCbr36eg}Uj$f^QrrOkr>KXZD`{r~^~ diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml deleted file mode 100644 index c5d5899..0000000 --- a/android/app/src/main/res/values/ic_launcher_background.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #FFFFFF - \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 624265c..0000000 --- a/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - Qortal - Qortal - com.example.app - com.example.app - diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml deleted file mode 100644 index be874e5..0000000 --- a/android/app/src/main/res/values/styles.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/android/app/src/main/res/xml/file_paths.xml b/android/app/src/main/res/xml/file_paths.xml deleted file mode 100644 index bd0c4d8..0000000 --- a/android/app/src/main/res/xml/file_paths.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java deleted file mode 100644 index 0297327..0000000 --- a/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.getcapacitor.myapp; - -import static org.junit.Assert.*; - -import org.junit.Test; - -/** - * Example local unit test, which will execute on the development machine (host). - * - * @see Testing documentation - */ -public class ExampleUnitTest { - - @Test - public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); - } -} diff --git a/android/build.gradle b/android/build.gradle deleted file mode 100644 index 7e1c3f3..0000000 --- a/android/build.gradle +++ /dev/null @@ -1,33 +0,0 @@ -// Top-level build file where you can add configuration options common to all sub-projects/modules. - -buildscript { - - repositories { - google() - mavenCentral() - } - dependencies { - classpath 'com.android.tools.build:gradle:8.2.1' - classpath 'com.google.gms:google-services:4.4.0' - - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files - } -} - -apply from: "variables.gradle" - -allprojects { - repositories { - google() - mavenCentral() - maven { - // capacitor-background-fetch - url("${project(':transistorsoft-capacitor-background-fetch').projectDir}/libs") - } - } -} - -task clean(type: Delete) { - delete rootProject.buildDir -} diff --git a/android/capacitor.settings.gradle b/android/capacitor.settings.gradle deleted file mode 100644 index c72458d..0000000 --- a/android/capacitor.settings.gradle +++ /dev/null @@ -1,18 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') - -include ':capacitor-browser' -project(':capacitor-browser').projectDir = new File('../node_modules/@capacitor/browser/android') - -include ':capacitor-filesystem' -project(':capacitor-filesystem').projectDir = new File('../node_modules/@capacitor/filesystem/android') - -include ':capacitor-local-notifications' -project(':capacitor-local-notifications').projectDir = new File('../node_modules/@capacitor/local-notifications/android') - -include ':evva-capacitor-secure-storage-plugin' -project(':evva-capacitor-secure-storage-plugin').projectDir = new File('../node_modules/@evva/capacitor-secure-storage-plugin/android') - -include ':transistorsoft-capacitor-background-fetch' -project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../node_modules/@transistorsoft/capacitor-background-fetch/android') diff --git a/android/gradle.properties b/android/gradle.properties deleted file mode 100644 index 2e87c52..0000000 --- a/android/gradle.properties +++ /dev/null @@ -1,22 +0,0 @@ -# Project-wide Gradle settings. - -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. - -# For more details on how to configure your build environment visit -# http://www.gradle.org/docs/current/userguide/build_environment.html - -# Specifies the JVM arguments used for the daemon process. -# The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m - -# When configured, Gradle will run in incubating parallel mode. -# This option should only be used with decoupled projects. More details, visit -# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects -# org.gradle.parallel=true - -# AndroidX package structure to make it clearer which packages are bundled with the -# Android operating system, and which are packaged with your app's APK -# https://developer.android.com/topic/libraries/support-library/androidx-rn -android.useAndroidX=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 033e24c4cdf41af1ab109bc7f253b2b887023340..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63375 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≫L+crb^Bz zc+Nw%zgpZ6>!A3%lau!Pw6`Y#WPVBtAfKSsqwYDWQK-~ zz(mx=nJ6-8t`YXB{6gaZ%G}Dmn&o500Y}2Rd?e&@=hBEmB1C=$OMBfxX__2c2O4K2#(0ksclP$SHp*8jq-1&(<6(#=6&H`Nlc2RVC4->r6U}sTY<1? zn@tv7XwUs-c>Lcmrm5AE0jHI5={WgHIow6cX=UK)>602(=arbuAPZ37;{HTJSIO%9EL`Et5%J7$u_NaC(55x zH^qX^H}*RPDx)^c46x>js=%&?y?=iFs^#_rUl@*MgLD92E5y4B7#EDe9yyn*f-|pQ zi>(!bIg6zY5fLSn@;$*sN|D2A{}we*7+2(4&EhUV%Qqo5=uuN^xt_hll7=`*mJq6s zCWUB|s$)AuS&=)T&_$w>QXHqCWB&ndQ$y4-9fezybZb0bYD^zeuZ>WZF{rc>c4s`` zgKdppTB|o>L1I1hAbnW%H%EkFt%yWC|0~+o7mIyFCTyb?@*Ho)eu(x`PuO8pLikN> z6YeI`V?AUWD(~3=8>}a6nZTu~#QCK(H0+4!ql3yS`>JX;j4+YkeG$ZTm33~PLa3L} zksw7@%e-mBM*cGfz$tS4LC^SYVdBLsR}nAprwg8h2~+Cv*W0%izK+WPVK}^SsL5R_ zpA}~G?VNhJhqx2he2;2$>7>DUB$wN9_-adL@TqVLe=*F8Vsw-yho@#mTD6*2WAr6B zjtLUh`E(;#p0-&$FVw(r$hn+5^Z~9J0}k;j$jL1;?2GN9s?}LASm?*Rvo@?E+(}F& z+=&M-n`5EIz%%F^e)nnWjkQUdG|W^~O|YeY4Fz}>qH2juEere}vN$oJN~9_Th^&b{ z%IBbET*E8%C@jLTxV~h#mxoRrJCF{!CJOghjuKOyl_!Jr?@4Upo7u>fTGtfm|CH2v z&9F+>;6aFbYXLj3{yZ~Yn1J2%!)A3~j2$`jOy{XavW@t)g}}KUVjCWG0OUc7aBc=2 zR3^u=dT47=5SmT{K1aGaVZkOx|24T-J0O$b9dfB25J|7yb6frwS6wZ1^y%EWOm}S< zc1SdYhfsdLG*FB-;!QLV3D!d~hnXTGVQVck9x%=B(Kk8c3y%f0nR95_TbY;l=obSl zEE@fp0|8Q$b3(+DXh?d0FEloGhO0#11CLQT5qtEckBLe-VN-I>9ys}PVK0r;0!jIG zH_q$;a`3Xv9P_V2ekV1SMzd#SKo<1~Dq2?M{(V;AwhH_2x@mN$=|=cG0<3o^j_0OF z7|WJ-f2G=7sA4NVGU2X5`o*D2T7(MbmZ2(oipooE{R?9!{WxX!%ofhsrPAxoIk!Kr z>I$a{Zq=%KaLrDCIL^gmA3z{2z%Wkr)b$QHcNUA^QwydWMJmxymO0QS22?mo%4(Md zgME(zE}ub--3*wGjV`3eBMCQG-@Gel1NKZDGuqobN|mAt0{@ZC9goI|BSmGBTUZ(`Xt z^e2LiMg?6E?G*yw(~K8lO(c4)RY7UWxrXzW^iCg-P41dUiE(i+gDmmAoB?XOB}+Ln z_}rApiR$sqNaT4frw69Wh4W?v(27IlK$Toy<1o)GeF+sGzYVeJ`F)3`&2WDi^_v67 zg;@ehwl3=t+}(DJtOYO!s`jHyo-}t@X|U*9^sIfaZfh;YLqEFmZ^E;$_XK}%eq;>0 zl?+}*kh)5jGA}3daJ*v1knbW0GusR1+_xD`MFPZc3qqYMXd>6*5?%O5pC7UVs!E-` zuMHc6igdeFQ`plm+3HhP)+3I&?5bt|V8;#1epCsKnz0%7m9AyBmz06r90n~9o;K30 z=fo|*`Qq%dG#23bVV9Jar*zRcV~6fat9_w;x-quAwv@BkX0{9e@y0NB(>l3#>82H6 z^US2<`=M@6zX=Pz>kb8Yt4wmeEo%TZ=?h+KP2e3U9?^Nm+OTx5+mVGDvgFee%}~~M zK+uHmj44TVs}!A}0W-A92LWE%2=wIma(>jYx;eVB*%a>^WqC7IVN9{o?iw{e4c=CG zC#i=cRJZ#v3 zF^9V+7u?W=xCY%2dvV_0dCP%5)SH*Xm|c#rXhwEl*^{Ar{NVoK*H6f5qCSy`+|85e zjGaKqB)p7zKNKI)iWe6A9qkl=rTjs@W1Crh(3G57qdT0w2ig^{*xerzm&U>YY{+fZbkQ#;^<$JniUifmAuEd^_M(&?sTrd(a*cD! zF*;`m80MrZ^> zaF{}rDhEFLeH#`~rM`o903FLO?qw#_Wyb5}13|0agjSTVkSI6Uls)xAFZifu@N~PM zQ%o?$k)jbY0u|45WTLAirUg3Zi1E&=G#LnSa89F3t3>R?RPcmkF}EL-R!OF_r1ZN` z?x-uHH+4FEy>KrOD-$KHg3$-Xl{Cf0;UD4*@eb~G{CK-DXe3xpEEls?SCj^p z$Uix(-j|9f^{z0iUKXcZQen}*`Vhqq$T?^)Ab2i|joV;V-qw5reCqbh(8N)c%!aB< zVs+l#_)*qH_iSZ_32E~}>=wUO$G_~k0h@ch`a6Wa zsk;<)^y=)cPpHt@%~bwLBy;>TNrTf50BAHUOtt#9JRq1ro{w80^sm-~fT>a$QC;<| zZIN%&Uq>8`Js_E((_1sewXz3VlX|-n8XCfScO`eL|H&2|BPZhDn}UAf_6s}|!XpmUr90v|nCutzMjb9|&}#Y7fj_)$alC zM~~D6!dYxhQof{R;-Vp>XCh1AL@d-+)KOI&5uKupy8PryjMhTpCZnSIQ9^Aq+7=Mb zCYCRvm4;H=Q8nZWkiWdGspC_Wvggg|7N`iED~Eap)Th$~wsxc(>(KI>{i#-~Dd8iQ zzonqc9DW1w4a*}k`;rxykUk+~N)|*I?@0901R`xy zN{20p@Ls<%`1G1Bx87Vm6Z#CA`QR(x@t8Wc?tpaunyV^A*-9K9@P>hAWW9Ev)E$gb z<(t?Te6GcJX2&0% z403pe>e)>m-^qlJU^kYIH)AutgOnq!J>FoMXhA-aEx-((7|(*snUyxa+5$wx8FNxS zKuVAVWArlK#kDzEM zqR?&aXIdyvxq~wF?iYPho*(h?k zD(SBpRDZ}z$A})*Qh!9&pZZRyNixD!8)B5{SK$PkVET(yd<8kImQ3ILe%jhx8Ga-1 zE}^k+Eo^?c4Y-t2_qXiVwW6i9o2qosBDj%DRPNT*UXI0=D9q{jB*22t4HHcd$T&Xi zT=Vte*Gz2E^qg%b7ev04Z&(;=I4IUtVJkg<`N6i7tjUn-lPE(Y4HPyJKcSjFnEzCH zPO(w%LmJ_=D~}PyfA91H4gCaf-qur3_KK}}>#9A}c5w@N;-#cHph=x}^mQ3`oo`Y$ope#)H9(kQK zGyt<7eNPuSAs$S%O>2ElZ{qtDIHJ!_THqTwcc-xfv<@1>IJ;YTv@!g-zDKBKAH<

Zet1e^8c}8fE97XH}+lF{qbF<`Y%dU|I!~Y`ZrVfKX82i z)(%!Tcf~eE^%2_`{WBPGPU@1NB5SCXe1sAI<4&n1IwO{&S$ThWn37heGOSW%nW7*L zxh0WK!E7zh%6yF-7%~l@I~b`2=*$;RYbi(I#zp$gL_d39U4A)KuB( zcS0bt48&%G_I~( zL(}w&2NA6#$=|g)J+-?ehHflD^lr77ngdz=dszFI;?~ZxeJv=gsm?4$$6#V==H{fa zqO!EkT>1-OQSJoX)cN}XsB;shvrHRwTH(I2^Ah4|rizn!V7T7fLh~Z<`Q+?zEMVxh z$=-x^RR*PlhkV_8mshTvs+zmZWY&Jk{9LX0Nx|+NAEq-^+Rh|ZlinVZ=e8=`WQt;e@= zPU}^1cG*O;G7l{Y#nl znp`y%CO_SC7gk0i0gY&phM04Y)~vU0!3$V$2T+h(1ZS+cCgc zaC?3M;B48^faGo>h~--#FNFauH?0BJJ6_nG5qOlr>k~%DCSJaOfl%KWHusw>tGrTxAhlEVDxc8R2C-)LCt&$Rt9IKor=ml7jirX@?WW+M z^I{b}MD5r$s>^^sN@&g`cXD~S_u09xo;{;noKZatIuzqd zW1e7oTl9>g8opPBT(p+&fo0F#!c{NFYYpIZ6u8hOB{F#{nP)@})X20$3iJtG$cO zJ$Oxl_qH{sL5d?=D$2M4C3Ajc;GN0(B-HVT;@pJ-LvIrN%|SY?t}g!J>ufQrR%hoY z!nr$tq~N%)9}^tEip93XW=MQ1@XovSvn`PTqXeT9@_7hGv4%LK1M**Q%UKi|(v@1_ zKGe*@+1%Y4v&`;5vUL`C&{tc+_7HFs7*OtjY8@Gg`C4O&#An{0xOvgNSehTHS~_1V z=daxCMzI5b_ydM5$z zZl`a{mM}i@x;=QyaqJY&{Q^R*^1Yzq!dHH~UwCCga+Us~2wk59ArIYtSw9}tEmjbo z5!JA=`=HP*Ae~Z4Pf7sC^A3@Wfa0Ax!8@H_&?WVe*)9B2y!8#nBrP!t1fqhI9jNMd zM_5I)M5z6Ss5t*f$Eh{aH&HBeh310Q~tRl3wCEcZ>WCEq%3tnoHE)eD=)XFQ7NVG5kM zaUtbnq2LQomJSWK)>Zz1GBCIHL#2E>T8INWuN4O$fFOKe$L|msB3yTUlXES68nXRX zP6n*zB+kXqqkpQ3OaMc9GqepmV?Ny!T)R@DLd`|p5ToEvBn(~aZ%+0q&vK1)w4v0* zgW44F2ixZj0!oB~^3k|vni)wBh$F|xQN>~jNf-wFstgiAgB!=lWzM&7&&OYS=C{ce zRJw|)PDQ@3koZfm`RQ$^_hEN$GuTIwoTQIDb?W&wEo@c75$dW(ER6q)qhF`{#7UTuPH&)w`F!w z0EKs}=33m}_(cIkA2rBWvApydi0HSOgc>6tu&+hmRSB%)s`v_NujJNhKLS3r6hv~- z)Hm@?PU{zd0Tga)cJWb2_!!9p3sP%Z zAFT|jy;k>4X)E>4fh^6=SxV5w6oo`mus&nWo*gJL zZH{SR!x)V)y=Qc7WEv-xLR zhD4OcBwjW5r+}pays`o)i$rcJb2MHLGPmeOmt5XJDg@(O3PCbxdDn{6qqb09X44T zh6I|s=lM6Nr#cGaA5-eq*T=LQ6SlRq*`~`b+dVi5^>el1p;#si6}kK}>w;1 z6B1dz{q_;PY{>DBQ+v@1pfXTd5a*^H9U*;qdj@XBF}MoSSQxVXeUpEM5Z0909&8$pRfR|B(t0ox&xl8{8mUNd#(zWONW{oycv$VjP1>q;jU@ z@+8E~fjz*I54OFFaQ{A5jn1w>r;l!NRlI(8q3*%&+tM?lov_G3wB`<}bQ>1=&xUht zmti5VZzV1Cx006Yzt|%Vwid>QPX8Nfa8|sue7^un@C+!3h!?-YK>lSfNIHh|0kL8v zbv_BklQ4HOqje|@Fyxn%IvL$N&?m(KN;%`I$N|muStjSsgG;gP4Smgz$2u(mG;DXP zf~uQ z212x^l6!MW>V@ORUGSFLAAjz3i5zO$=UmD_zhIk2OXUz^LkDLWjla*PW?l;`LLos> z7FBvCr)#)XBByDm(=n%{D>BcUq>0GOV9`i-(ZSI;RH1rdrAJ--f0uuAQ4odl z_^$^U_)0BBJwl@6R#&ZtJN+@a(4~@oYF)yG+G#3=)ll8O#Zv3SjV#zSXTW3h9kqn* z@AHL=vf~KMas}6{+u=}QFumr-!c=(BFP_dwvrdehzTyqco)m@xRc=6b#Dy+KD*-Bq zK=y*1VAPJ;d(b?$2cz{CUeG(0`k9_BIuUki@iRS5lp3=1#g)A5??1@|p=LOE|FNd; z-?5MLKd-5>yQ7n__5W^3C!_`hP(o%_E3BKEmo1h=H(7;{6$XRRW6{u+=oQX<((xAJ zNRY`Egtn#B1EBGHLy^eM5y}Jy0h!GAGhb7gZJoZI-9WuSRw)GVQAAcKd4Qm)pH`^3 zq6EIM}Q zxZGx%aLnNP1an=;o8p9+U^>_Bi`e23E^X|}MB&IkS+R``plrRzTE%ncmfvEW#AHJ~ znmJ`x&ez6eT21aLnoI`%pYYj zzQ?f^ob&Il;>6Fe>HPhAtTZa*B*!;;foxS%NGYmg!#X%)RBFe-acahHs3nkV61(E= zhekiPp1d@ACtA=cntbjuv+r-Zd`+lwKFdqZuYba_ey`&H<Psu;Tzwt;-LQxvv<_D5;ik7 zwETZe`+voUhk%$s2-7Rqfl`Ti_{(fydI(DAHKr<66;rYa6p8AD+NEc@Fd@%m`tiK% z=Mebzrtp=*Q%a}2UdK4J&5#tCN5PX>W=(9rUEXZ8yjRu+7)mFpKh{6;n%!bI(qA9kfyOtstGtOl zX!@*O0fly*L4k##fsm&V0j9Lj<_vu1)i?!#xTB7@2H&)$Kzt@r(GH=xRZlIimTDd_o(%9xO388LwC#;vQ?7OvRU_s< zDS@6@g}VnvQ+tn(C#sx0`J^T4WvFxYI17;uPs-Ub{R`J-NTdtBGl+Q>e81Z3#tDUr ztnVc*p{o|RNnMYts4pdw=P!uJkF@8~h)oV4dXu5F7-j0AW|=mt!QhP&ZV!!82*c7t zuOm>B*2gFtq;A8ynZ~Ms?!gEi5<{R_8tRN%aGM!saR4LJQ|?9w>Ff_61(+|ol_vL4 z-+N>fushRbkB4(e{{SQ}>6@m}s1L!-#20N&h%srA=L50?W9skMF9NGfQ5wU*+0<@> zLww8%f+E0Rc81H3e_5^DB@Dn~TWYk}3tqhO{7GDY;K7b*WIJ-tXnYM@z4rn(LGi?z z8%$wivs)fC#FiJh?(SbH-1bgdmHw&--rn7zBWe1xAhDdv#IRB@DGy}}zS%M0(F_3_ zLb-pWsdJ@xXE;=tpRAw?yj(Gz=i$;bsh&o2XN%24b6+?_gJDBeY zws3PE2u!#Cec>aFMk#ECxDlAs;|M7@LT8)Y4(`M}N6IQ{0YtcA*8e42!n^>`0$LFU zUCq2IR2(L`f++=85M;}~*E($nE&j;p{l%xchiTau*tB9bI= zn~Ygd@<+9DrXxoGPq}@vI1Q3iEfKRleuy*)_$+hg?+GOgf1r?d@Or42|s|D>XMa;ebr1uiTNUq@heusd6%WwJqyCCv!L*qou9l!B22H$bQ z)<)IA>Yo77S;|`fqBk!_PhLJEQb0wd1Z|`pCF;hol!34iQYtqu3K=$QxLW7(HFx~v>`vVRr zyqk^B4~!3F8t8Q_D|GLRrAbbQDf??D&Jd|mgw*t1YCd)CM2$76#Cqj1bD*vADwavp zS<`n@gLU4pwCqNPsIfHKl{5}gu9t-o+O< z??!fMqMrt$s}02pdBbOScUrc1T*{*-ideR6(1q4@oC6mxg8v8Y^h^^hfx6| z|Mld6Ax1CuSlmSJmHwdOix?$8emihK#&8&}u8m!#T1+c5u!H)>QW<7&R$eih)xkov zHvvEIJHbkt+2KQ<-bMR;2SYX?8SI=_<-J!GD5@P2FJ}K z5u82YFotCJF(dUeJFRX_3u8%iIYbRS??A?;iVO?84c}4Du9&jG<#urlZ_Unrcg8dR z!5I3%9F*`qwk#joKG_Q%5_xpU7|jm4h0+l$p;g%Tr>i74#3QnMXdz|1l2MQN$yw|5 zThMw15BxjWf2{KM)XtZ+e#N)ihlkxPe=5ymT9>@Ym%_LF}o z1XhCP`3E1A{iVoHA#|O|&5=w;=j*Qf`;{mBAK3={y-YS$`!0UmtrvzHBfR*s{z<0m zW>4C=%N98hZlUhwAl1X`rR)oL0&A`gv5X79??p_==g*n4$$8o5g9V<)F^u7v0Vv^n z1sp8{W@g6eWv2;A31Rhf5j?KJhITYfXWZsl^`7z`CFtnFrHUWiD?$pwU6|PQjs|7RA0o9ARk^9$f`u3&C|#Z3iYdh<0R`l2`)6+ z6tiDj@xO;Q5PDTYSxsx6n>bj+$JK8IPJ=U5#dIOS-zwyK?+t^V`zChdW|jpZuReE_ z)e~ywgFe!0q|jzsBn&(H*N`%AKpR@qM^|@qFai0};6mG_TvXjJ`;qZ{lGDZHScZk( z>pO+%icp)SaPJUwtIPo1BvGyP8E@~w2y}=^PnFJ$iHod^JH%j1>nXl<3f!nY9K$e` zq-?XYl)K`u*cVXM=`ym{N?z=dHQNR23M8uA-(vsA$6(xn+#B-yY!CB2@`Uz({}}w+ z0sni*39>rMC!Ay|1B@;al%T&xE(wCf+`3w>N)*LxZZZYi{5sqiVWgbNd>W*X?V}C- zjQ4F7e_uCUOHbtewQkq?m$*#@ZvWbu{4i$`aeKM8tc^ zL5!GL8gX}c+qNUtUIcps1S)%Gsx*MQLlQeoZz2y2OQb(A73Jc3`LmlQf0N{RTt;wa`6h|ljX1V7UugML=W5-STDbeWTiEMjPQ$({hn_s&NDXzs6?PLySp$?L`0ilH3vCUO{JS0Dp`z;Ry$6}R@1NdY7rxccbm$+;ApSe=2q!0 z()3$vYN0S$Cs)#-OBs{_2uFf}L4h$;7^2w20=l%5r9ui&pTEgg4U!FoCqyA6r2 zC5s72l}i*9y|KTjDE5gVlYe4I2gGZD)e`Py2gq7cK4at{bT~DSbQQ4Z4sl)kqXbbr zqvXtSqMrDdT2qt-%-HMoqeFEMsv~u)-NJ%Z*ipSJUm$)EJ+we|4*-Mi900K{K|e0; z1_j{X5)a%$+vM7;3j>skgrji92K1*Ip{SfM)=ob^E374JaF!C(cZ$R_E>Wv+?Iy9M z?@`#XDy#=z%3d9&)M=F8Xq5Zif%ldIT#wrlw(D_qOKo4wD(fyDHM5(wm1%7hy6euJ z%Edg!>Egs;ZC6%ktLFtyN0VvxN?*4C=*tOEw`{KQvS7;c514!FP98Nf#d#)+Y-wsl zP3N^-Pnk*{o(3~m=3DX$b76Clu=jMf9E?c^cbUk_h;zMF&EiVz*4I(rFoaHK7#5h0 zW7CQx+xhp}Ev+jw;SQ6P$QHINCxeF8_VX=F3&BWUd(|PVViKJl@-sYiUp@xLS2NuF z8W3JgUSQ&lUp@2E(7MG`sh4X!LQFa6;lInWqx}f#Q z4xhgK1%}b(Z*rZn=W{wBOe7YQ@1l|jQ|9ELiXx+}aZ(>{c7Ltv4d>PJf7f+qjRU8i%XZZFJkj&6D^s;!>`u%OwLa*V5Js9Y$b-mc!t@{C415$K38iVu zP7!{3Ff%i_e!^LzJWhBgQo=j5k<<($$b&%%Xm_f8RFC_(97&nk83KOy@I4k?(k<(6 zthO$3yl&0x!Pz#!79bv^?^85K5e7uS$ zJ33yka2VzOGUhQXeD{;?%?NTYmN3{b0|AMtr(@bCx+c=F)&_>PXgAG}4gwi>g82n> zL3DlhdL|*^WTmn;XPo62HhH-e*XIPSTF_h{#u=NY8$BUW=5@PD{P5n~g5XDg?Fzvb_u ziK&CJqod4srfY2T?+4x@)g9%3%*(Q2%YdCA3yM{s=+QD0&IM`8k8N&-6%iIL3kon> z0>p3BUe!lrz&_ZX2FiP%MeuQY-xVV%K?=bGPOM&XM0XRd7or< zy}jn_eEzuQ>t2fM9ict#ZNxD7HUycsq76IavfoNl$G1|t*qpUSX;YgpmJrr_8yOJ2 z(AwL;Ugi{gJ29@!G-mD82Z)46T`E+s86Qw|YSPO*OoooraA!8x_jQXYq5vUw!5f_x zubF$}lHjIWxFar8)tTg8z-FEz)a=xa`xL~^)jIdezZsg4%ePL$^`VN#c!c6`NHQ9QU zkC^<0f|Ksp45+YoX!Sv>+57q}Rwk*2)f{j8`d8Ctz^S~me>RSakEvxUa^Pd~qe#fb zN7rnAQc4u$*Y9p~li!Itp#iU=*D4>dvJ{Z~}kqAOBcL8ln3YjR{Sp!O`s=5yM zWRNP#;2K#+?I&?ZSLu)^z-|*$C}=0yi7&~vZE$s``IE^PY|dj^HcWI$9ZRm>3w(u` z-1%;;MJbzHFNd^!Ob!^PLO-xhhj@XrI81Y)x4@FdsI( za`o4Gy(`T$P?PB?s>o+eIOtuirMykbuAi65Y_UN1(?jTCy@J8Px`%;bcNmPm#Fr!= z5V!YViFJ!FBfEq>nJFk0^RAV1(7w+X`HRgP;nJHJdMa!}&vvduCMoslwHTes_I76|h>;(-9lbfGnt zoZomakOt759AuTX4b$)G8TzJ&m*BV8!vMs9#=e0tWa z%)84R=3?tfh72~=Rc;fXwj+x z+25xapYK@2@;}6)@8IL+F6iuJ_B{&A-0=U=U6WMbY>~ykVFp$XkH)f**b>TE5)shN z39E2L@JPCSl!?pkvFeh@6dCv9oE}|{GbbVM!XIgByN#md&tXy@>QscU0#z!I&X4;d z&B&ZA4lbrHJ!x4lCN4KC-)u#gT^cE{Xnhu`0RXVKn|j$vz8m}v^%*cQ{(h%FW8_8a zFM{$PirSI8@#*xg2T){A+EKX(eTC66Fb})w{vg%Vw)hvV-$tttI^V5wvU?a{(G}{G z@ob7Urk1@hDN&C$N!Nio9YrkiUC{5qA`KH*7CriaB;2~2Od>2l=WytBRl#~j`EYsj}jqK2xD*3 ztEUiPZzEJC??#Tj^?f)=sRXOJ_>5aO(|V#Yqro05p6)F$j5*wYr1zz|T4qz$0K(5! zr`6Pqd+)%a9Xq3aNKrY9843)O56F%=j_Yy_;|w8l&RU1+B4;pP*O_}X8!qD?IMiyT zLXBOOPg<*BZtT4LJ7DfyghK|_*mMP7a1>zS{8>?}#_XXaLoUBAz(Wi>$Q!L;oQ&cL z6O|T6%Dxq3E35$0g5areq9$2+R(911!Z9=wRPq-pju7DnN9LAfOu3%&onnfx^Px5( zT2^sU>Y)88F5#ATiVoS$jzC-M`vY8!{8#9O#3c&{7J1lo-rcNK7rlF0Zt*AKE(WN* z*o?Tv?Sdz<1v6gfCok8MG6Pzecx9?C zrQG5j^2{V556Hj=xTiU-seOCr2ni@b<&!j>GyHbv!&uBbHjH-U5Ai-UuXx0lcz$D7%=! z&zXD#Jqzro@R=hy8bv>D_CaOdqo6)vFjZldma5D+R;-)y1NGOFYqEr?h zd_mTwQ@K2veZTxh1aaV4F;YnaWA~|<8$p}-eFHashbWW6Dzj=3L=j-C5Ta`w-=QTw zA*k9!Ua~-?eC{Jc)xa;PzkUJ#$NfGJOfbiV^1au;`_Y8|{eJ(~W9pP9q?gLl5E6|e{xkT@s|Ac;yk01+twk_3nuk|lRu{7-zOjLAGe!)j?g+@-;wC_=NPIhk(W zfEpQrdRy z^Q$YBs%>$=So>PAMkrm%yc28YPi%&%=c!<}a=)sVCM51j+x#<2wz?2l&UGHhOv-iu z64x*^E1$55$wZou`E=qjP1MYz0xErcpMiNYM4+Qnb+V4MbM;*7vM_Yp^uXUuf`}-* z_2CnbQ);j5;Rz?7q)@cGmwE^P>4_u9;K|BFlOz_|c^1n~%>!uO#nA?5o4A>XLO{X2 z=8M%*n=IdnXQ}^+`DXRKM;3juVrXdgv79;E=ovQa^?d7wuw~nbu%%lsjUugE8HJ9zvZIM^nWvjLc-HKc2 zbj{paA}ub~4N4Vw5oY{wyop9SqPbWRq=i@Tbce`r?6e`?`iOoOF;~pRyJlKcIJf~G z)=BF$B>YF9>qV#dK^Ie#{0X(QPnOuu((_-u?(mxB7c9;LSS-DYJ8Wm4gz1&DPQ8;0 z=Wao(zb1RHXjwbu_Zv<=9njK28sS}WssjOL!3-E5>d17Lfnq0V$+IU84N z-4i$~!$V-%Ik;`Z3MOqYZdiZ^3nqqzIjLE+zpfQC+LlomQu-uNCStj%MsH(hsimN# z%l4vpJBs_2t7C)x@6*-k_2v0FOk<1nIRO3F{E?2DnS}w> z#%9Oa{`RB5FL5pKLkg59#x~)&I7GzfhiVC@LVFSmxZuiRUPVW*&2ToCGST0K`kRK) z02#c8W{o)w1|*YmjGSUO?`}ukX*rHIqGtFH#!5d1Jd}&%4Kc~Vz`S7_M;wtM|6PgI zNb-Dy-GI%dr3G3J?_yBX#NevuYzZgzZ!vN>$-aWOGXqX!3qzCIOzvA5PLC6GLIo|8 zQP^c)?NS29hPmk5WEP>cHV!6>u-2rR!tit#F6`_;%4{q^6){_CHGhvAs=1X8Fok+l zt&mk>{4ARXVvE-{^tCO?inl{)o}8(48az1o=+Y^r*AIe%0|{D_5_e>nUu`S%zR6|1 zu0$ov7c`pQEKr0sIIdm7hm{4K_s0V%M-_Mh;^A0*=$V9G1&lzvN9(98PEo=Zh$`Vj zXh?fZ;9$d!6sJRSjTkOhb7@jgSV^2MOgU^s2Z|w*e*@;4h?A8?;v8JaLPCoKP_1l- z=Jp0PYDf(d2Z`;O7mb6(_X_~z0O2yq?H`^c=h|8%gfywg#}wIyv&_uW{-e8e)YmGR zI0NNSDoJWa%0ztGzkwl>IYW*DesPRY?oH+ow^(>(47XUm^F`fAa0B~ja-ae$e>4-A z64lb_;|W0ppKI+ zxu2VLZzv4?Mr~mi?WlS-1L4a^5k+qb5#C)ktAYGUE1H?Vbg9qsRDHAvwJUN=w~AuT zUXYioFg2Dx-W)}w9VdFK#vpjoSc!WcvRZ_;TgHu;LSY*i7K_>Px{%C4-IL?6q?Qa_ zL7l=EEo|@X&$gX;fYP02qJF~LN9?E-OL2G(Fo4hW)G{`qnW zTIuc+-1VJvKgph0jAc(LzM);Pg$MPln?U|ek{_5nNJHfm-Y#ec+n#Yf_e>XfbLbN)eqHEDr0#?<;TskL5-0JGv|Ut{=$Xk8hlwbaMXdcI3GL zY-hykR{zX9liy$Z2F3!z346uu%9@-y6Gda`X2*ixlD_P@<}K?AoV?(%lM%* z(xNk=|A()443aGj)-~IDf3J+UA2p2lh6ei^pG*HL#SiThnIr5WZDXebI)F7X zGmP-3bH$i$+(IwqgbM7h%G5oJ@4{Z~qZ#Zs*k7eXJIqg;@0kAGV|b=F#hZs)2BYu1 zr8sj#Zd+Iu^G}|@-dR5S*U-;DqzkX3V0@q-k8&VHW?h0b0?tJ-Atqmg^J8iF7DP6k z)W{g?5~F*$5x?6W)3YKcrNu8%%(DglnzMx5rsU{#AD+WPpRBf``*<8F-x75D$$13U zcaNXYC0|;r&(F@!+E=%+;bFKwKAB$?6R%E_QG5Yn5xX#h+zeI-=mdXD5+D+lEuM`M ze+*G!zX^xbnA?~LnPI=D2`825Ax8rM()i*{G0gcV5MATV?<7mh+HDA7-f6nc@95st zzC_si${|&=$MUj@nLxl_HwEXb2PDH+V?vg zA^DJ%dn069O9TNK-jV}cQKh|$L4&Uh`?(z$}#d+{X zm&=KTJ$+KvLZv-1GaHJm{>v=zXW%NSDr8$0kSQx(DQ)6S?%sWSHUazXSEg_g3agt2@0nyD?A?B%9NYr(~CYX^&U#B4XwCg{%YMYo%e68HVJ7`9KR`mE*Wl7&5t71*R3F>*&hVIaZXaI;2a$?;{Ew{e3Hr1* zbf$&Fyhnrq7^hNC+0#%}n^U2{ma&eS)7cWH$bA@)m59rXlh96piJu@lcKl<>+!1#s zW#6L5Ov%lS(?d66-(n`A%UuiIqs|J|Ulq0RYq-m&RR0>wfA1?<34tI?MBI#a8lY{m z{F2m|A@=`DpZpwdIH#4)9$#H3zr4kn2OX!UE=r8FEUFAwq6VB?DJ8h59z$GXud$#+ zjneIq8uSi&rnG0IR8}UEn5OcZC?@-;$&Ry9hG{-1ta`8aAcOe1|82R7EH`$Qd3sf* zbrOk@G%H7R`j;hOosRVIP_2_-TuyB@rdj?(+k-qQwnhV3niH+CMl>ELX(;X3VzZVJ ztRais0C^L*lmaE(nmhvep+peCqr!#|F?iVagZcL>NKvMS_=*Yl%*OASDl3(mMOY9! z=_J$@nWpA-@><43m4olSQV8(PwhsO@+7#qs@0*1fDj70^UfQ(ORV0N?H{ceLX4<43 zEn)3CGoF&b{t2hbIz;Og+$+WiGf+x5mdWASEWIA*HQ9K9a?-Pf9f1gO6LanVTls)t z^f6_SD|>2Kx8mdQuiJwc_SmZOZP|wD7(_ti#0u=io|w~gq*Odv>@8JBblRCzMKK_4 zM-uO0Ud9>VD>J;zZzueo#+jbS7k#?W%`AF1@ZPI&q%}beZ|ThISf-ly)}HsCS~b^g zktgqOZ@~}1h&x50UQD~!xsW-$K~whDQNntLW=$oZDClUJeSr2$r3}94Wk1>co3beS zoY-7t{rGv|6T?5PNkY zj*XjF()ybvnVz5=BFnLO=+1*jG>E7F%&vm6up*QgyNcJJPD|pHoZ!H6?o3Eig0>-! zt^i-H@bJ;^!$6ZSH}@quF#RO)j>7A5kq4e+7gK=@g;POXcGV28Zv$jybL1J`g@wC# z_DW1ck}3+n@h2LFQhwVfaV@D+-kff4celZC0;0ef?pA#*PPd8Kk8sO1wza&BHQFblVU8P1=-qScHff^^fR zycH!hlHQs7iejITpc4UaBxzqTJ}Z#^lk{W(cr`qtW~Ap;HvuUf#MxgEG?tEU+B?G% znub0I(s@XvI(lva}$Z7<}Qg=rWd5n)}rX{nb+Aw;}?l9LZI-`N-*hts=c6XgjfJs ztp>-686v6ug{glEZ}K=jVG|N1WSWrU*&ue|4Q|O@;s0#L5P*U%Vx;)w7S0ZmLuvwA z@zs2Kut)n1K7qaywO#TbBR`Q~%mdr`V)D`|gN0!07C1!r3{+!PYf9*;h?;dE@#z(k z;o`g~<>P|Sy$ldHTUR3v=_X0Iw6F>3GllrFXVW?gU0q6|ocjd!glA)#f0G7i20ly>qxRljgfO2)RVpvmg#BSrN)GbGsrIb}9 z1t+r;Q>?MGLk#LI5*vR*C8?McB|=AoAjuDk&Pn`KQo z`!|mi{Cz@BGJ!TwMUUTkKXKNtS#OVNxfFI_Gfq3Kpw0`2AsJv9PZPq9x?~kNNR9BR zw#2jp%;FJNoOzW>tE#zskPICp>XSs?|B0E%DaJH)rtLA}$Y>?P+vEOvr#8=pylh zch;H3J`RE1{97O+1(1msdshZx$it^VfM$`-Gw>%NN`K|Tr$0}U`J?EBgR%bg=;et0 z_en)!x`~3so^V9-jffh3G*8Iy6sUq=uFq%=OkYvHaL~#3jHtr4sGM?&uY&U8N1G}QTMdqBM)#oLTLdKYOdOY%{5#Tgy$7QA! zWQmP!Wny$3YEm#Lt8TA^CUlTa{Cpp=x<{9W$A9fyKD0ApHfl__Dz4!HVVt(kseNzV z5Fb`|7Mo>YDTJ>g;7_MOpRi?kl>n(ydAf7~`Y6wBVEaxqK;l;}6x8(SD7}Tdhe2SR zncsdn&`eI}u}@^~_9(0^r!^wuKTKbs-MYjXy#-_#?F=@T*vUG@p4X+l^SgwF>TM}d zr2Ree{TP5x@ZtVcWd3++o|1`BCFK(ja-QP?zj6=ZOq)xf$CfSv{v;jCcNt4{r8f+m zz#dP|-~weHla%rsyYhB_&LHkwuj83RuCO0p;wyXsxW5o6{)zFAC~2%&NL? z=mA}szjHKsVSSnH#hM|C%;r0D$7)T`HQ1K5vZGOyUbgXjxD%4xbs$DAEz)-;iO?3& zXcyU*Z8zm?pP}w&9ot_5I;x#jIn^Joi5jBDOBP1)+p@G1U)pL6;SIO>Nhw?9St2UN zMedM(m(T6bNcPPD`%|9dvXAB&IS=W4?*7-tqldqALH=*UapL!4`2TM_{`W&pm*{?| z0DcsaTdGA%RN={Ikvaa&6p=Ux5ycM){F1OgOh(^Yk-T}a5zHH|=%Jk)S^vv9dY~`x zG+!=lsDjp!D}7o94RSQ-o_g#^CnBJlJ@?saH&+j0P+o=eKqrIApyR7ttQu*0 z1f;xPyH2--)F9uP2#Mw}OQhOFqXF#)W#BAxGP8?an<=JBiokg;21gKG_G8X!&Hv;7 zP9Vpzm#@;^-lf=6POs>UrGm-F>-! zm;3qp!Uw?VuXW~*Fw@LC)M%cvbe9!F(Oa^Y6~mb=8%$lg=?a0KcGtC$5y?`L5}*-j z7KcU8WT>2PpKx<58`m((l9^aYa3uP{PMb)nvu zgt;ia9=ZofxkrW7TfSrQf4(2juZRBgcE1m;WF{v1Fbm}zqsK^>sj=yN(x}v9#_{+C zR4r7abT2cS%Wz$RVt!wp;9U7FEW&>T>YAjpIm6ZSM4Q<{Gy+aN`Vb2_#Q5g@62uR_>II@eiHaay+JU$J=#>DY9jX*2A=&y8G%b zIY6gcJ@q)uWU^mSK$Q}?#Arq;HfChnkAOZ6^002J>fjPyPGz^D5p}o;h2VLNTI{HGg!obo3K!*I~a7)p-2Z3hCV_hnY?|6i`29b zoszLpkmch$mJeupLbt4_u-<3k;VivU+ww)a^ekoIRj4IW4S z{z%4_dfc&HAtm(o`d{CZ^AAIE5XCMvwQSlkzx3cLi?`4q8;iFTzuBAddTSWjfcZp* zn{@Am!pl&fv#k|kj86e$2%NK1G4kU=E~z9L^`@%2<%Dx%1TKk_hb-K>tq8A9bCDfW z@;Dc3KqLafkhN6414^46Hl8Tcv1+$q_sYjj%oHz)bsoGLEY1)ia5p=#eii(5AM|TW zA8=;pt?+U~>`|J(B85BKE0cB4n> zWrgZ)Rbu}^A=_oz65LfebZ(1xMjcj_g~eeoj74-Ex@v-q9`Q{J;M!mITVEfk6cn!u zn;Mj8C&3^8Kn%<`Di^~Y%Z$0pb`Q3TA}$TiOnRd`P1XM=>5)JN9tyf4O_z}-cN|i> zwpp9g`n%~CEa!;)nW@WUkF&<|wcWqfL35A}<`YRxV~$IpHnPQs2?+Fg3)wOHqqAA* zPv<6F6s)c^o%@YqS%P{tB%(Lxm`hsKv-Hb}MM3=U|HFgh8R-|-K(3m(eU$L@sg=uW zB$vAK`@>E`iM_rSo;Cr*?&wss@UXi19B9*0m3t3q^<)>L%4j(F85Ql$i^;{3UIP0c z*BFId*_mb>SC)d#(WM1%I}YiKoleKqQswkdhRt9%_dAnDaKM4IEJ|QK&BnQ@D;i-ame%MR5XbAfE0K1pcxt z{B5_&OhL2cx9@Sso@u2T56tE0KC`f4IXd_R3ymMZ%-!e^d}v`J?XC{nv1mAbaNJX| zXau+s`-`vAuf+&yi2bsd5%xdqyi&9o;h&fcO+W|XsKRFOD+pQw-p^pnwwYGu=hF7& z{cZj$O5I)4B1-dEuG*tU7wgYxNEhqAxH?p4Y1Naiu8Lt>FD%AxJ811`W5bveUp%*e z9H+S}!nLI;j$<*Dn~I*_H`zM^j;!rYf!Xf#X;UJW<0gic?y>NoFw}lBB6f#rl%t?k zm~}eCw{NR_%aosL*t$bmlf$u|U2hJ*_rTcTwgoi_N=wDhpimYnf5j!bj0lQ*Go`F& z6Wg+xRv55a(|?sCjOIshTEgM}2`dN-yV>)Wf$J58>lNVhjRagGZw?U9#2p!B5C3~Nc%S>p`H4PK z7vX@|Uo^*F4GXiFnMf4gwHB;Uk8X4TaLX4A>B&L?mw4&`XBnLCBrK2FYJLrA{*))0 z$*~X?2^Q0KS?Yp##T#ohH1B)y4P+rR7Ut^7(kCwS8QqgjP!aJ89dbv^XBbLhTO|=A z|3FNkH1{2Nh*j{p-58N=KA#6ZS}Ir&QWV0CU)a~{P%yhd-!ehF&~gkMh&Slo9gAT+ zM_&3ms;1Um8Uy0S|0r{{8xCB&Tg{@xotF!nU=YOpug~QlZRKR{DHGDuk(l{)d$1VD zj)3zgPeP%wb@6%$zYbD;Uhvy4(D|u{Q_R=fC+9z#sJ|I<$&j$|kkJiY?AY$ik9_|% z?Z;gOQG5I%{2{-*)Bk|Tia8n>TbrmjnK+8u*_cS%*;%>R|K|?urtIdgTM{&}Yn1;| zk`xq*Bn5HP5a`ANv`B$IKaqA4e-XC`sRn3Z{h!hN0=?x(kTP+fE1}-<3eL+QDFXN- z1JmcDt0|7lZN8sh^=$e;P*8;^33pN>?S7C0BqS)ow4{6ODm~%3018M6P^b~(Gos!k z2AYScAdQf36C)D`w&p}V89Lh1s88Dw@zd27Rv0iE7k#|U4jWDqoUP;-He5cd4V7Ql)4S+t>u9W;R-8#aee-Ct1{fPD+jv&zV(L&k z)!65@R->DB?K6Aml57?psj5r;%w9Vc3?zzGs&kTA>J9CmtMp^Wm#1a@cCG!L46h-j z8ZUL4#HSfW;2DHyGD|cXHNARk*{ql-J2W`9DMxzI0V*($9{tr|O3c;^)V4jwp^RvW z2wzIi`B8cYISb;V5lK}@xtm3NB;88)Kn}2fCH(WRH1l@3XaO7{R*Lc7{ZN1m+#&diI7_qzE z?BS+v<)xVMwt{IJ4yS2Q4(77II<>kqm$Jc3yWL42^gG6^Idg+y3)q$-(m2>E49-fV zyvsCzJ5EM4hyz1r#cOh5vgrzNGCBS}(Bupe`v6z{e z)cP*a8VCbRuhPp%BUwIRvj-$`3vrbp;V3wmAUt{?F z0OO?Mw`AS?y@>w%(pBO=0lohnxFWx`>Hs}V$j{XI2?}BtlvIl7!ZMZukDF7 z^6Rq2H*36KHxJ1xWm5uTy@%7;N0+|<>Up>MmxKhb;WbH1+=S94nOS-qN(IKDIw-yr zi`Ll^h%+%k`Yw?o3Z|ObJWtfO|AvPOc96m5AIw;4;USG|6jQKr#QP}+BLy*5%pnG2 zyN@VMHkD`(66oJ!GvsiA`UP;0kTmUST4|P>jTRfbf&Wii8~a`wMwVZoJ@waA{(t(V zwoc9l*4F>YUM8!aE1{?%{P4IM=;NUF|8YkmG0^Y_jTJtKClDV3D3~P7NSm7BO^r7& zWn!YrNc-ryEvhN$$!P%l$Y_P$s8E>cdAe3=@!Igo^0diL6`y}enr`+mQD;RC?w zb8}gXT!aC`%rdxx2_!`Qps&&w4i0F95>;6;NQ-ys;?j#Gt~HXzG^6j=Pv{3l1x{0( z4~&GNUEbH=9_^f@%o&BADqxb54EAq=8rKA~4~A!iDp9%eFHeA1L!Bb8Lz#kF(p#)X zn`CglEJ(+tr=h4bIIHlLkxP>exGw~{Oe3@L^zA)|Vx~2yNuPKtF^cV6X^5lw8hU*b zK-w6x4l&YWVB%0SmN{O|!`Sh6H45!7}oYPOc+a#a|n3f%G@eO)N>W!C|!FNXV3taFdpEK*A1TFGcRK zV$>xN%??ii7jx5D69O>W6O`$M)iQU7o!TPG*+>v6{TWI@p)Yg$;8+WyE9DVBMB=vnONSQ6k1v z;u&C4wZ_C`J-M0MV&MpOHuVWbq)2LZGR0&@A!4fZwTM^i;GaN?xA%0)q*g(F0PIB( zwGrCC#}vtILC_irDXI5{vuVO-(`&lf2Q4MvmXuU8G0+oVvzZp0Y)zf}Co0D+mUEZz zgwR+5y!d(V>s1} zji+mrd_6KG;$@Le2Ic&am6O+Rk1+QS?urB4$FQNyg2%9t%!*S5Ts{8j*&(H1+W;0~ z$frd%jJjlV;>bXD7!a-&!n52H^6Yp}2h3&v=}xyi>EXXZDtOIq@@&ljEJG{D`7Bjr zaibxip6B6Mf3t#-*Tn7p z96yx1Qv-&r3)4vg`)V~f8>>1_?E4&$bR~uR;$Nz=@U(-vyap|Jx zZ;6Ed+b#GXN+gN@ICTHx{=c@J|97TIPWs(_kjEIwZFHfc!rl8Ep-ZALBEZEr3^R-( z7ER1YXOgZ)&_=`WeHfWsWyzzF&a;AwTqzg~m1lOEJ0Su=C2<{pjK;{d#;E zr2~LgXN?ol2ua5Y*1)`(be0tpiFpKbRG+IK(`N?mIgdd9&e6vxzqxzaa`e7zKa3D_ zHi+c1`|720|dn(z4Qos^e7sn(PU%NYLv$&!|4kEse%DK;YAD06@XO3!EpKpz!^*?(?-Ip zC_Zlb(-_as+-D?0Ag9`|4?)bN)5o(J=&udAY|YgV(YuK9k=E>0z`$dSaL(wmxd!1f zME&3wwv@#{dgeMlZ4}GL!I`VZxtdQY$lmauCN_|mGXqEEj@i~du$|>5UvLjsbq!{; z@jEf;21iC1jFEmIPE^4gykHQzCMLj=2Ek4&FvlpqTlS(0YT%*W<>XgH$4ww`D`aihBGkPM(&EG};Cl&wzg8!jL z`rkqPzvH(0Kd{2n=?Bt8aAU&0IyiA+V-qnXVId^qG!SWZ7%_f&i!D{R#7Jo$%tICxY%j)ebORE>3H_c|to}c#HX;HAC?~B;2mmQrMp2;8T zmzde!k7BYg^Z1r|DUvSD3@{6S<1kndb%Qt%GA# z+sB2&F5L`R&fLRdAlpU_pVsJsYDEz{^ zKGaAz#%W+MPGT+D$+xowMY0=ipM)0p?zym&Aoi)qL(pO_weO(k?s|ELHl^W zviJiFUXRL&?`;3_;mvc02A@sbsW9}#{anvGafZ#ST;}za?XS3}ZG3B4m(SW{>w}Fh z)T5Yi*``Tstmi9SHXmuWSND@cj}qtY!`tuD29Dpu+-D3$h<5FY>jE>YJvqBmhw?oll`x7Ono(}R~P zle_eBwYy0Rr7kmf_SEt_gn4)AO-r`}^Z5Y%Rm8)K-?X>rvDL+QT?#)QwDsQ2c$tc* z&#hbgkL6}GnBDH;+lREM6MGIskRa@r>5Iq(ll2IepuhW86w@14=E{6$cz*cBDQ)CT>}v-DLM-v8)xaPBnmGBKM63RgDGqh!<*j90tSE4|G^+r@#-7g2 zs8KE8eZPZhQuN>wBU%8CmkE9LH1%O;-*ty0&K~01>F3XB>6sAm*m3535)9T&Fz}A4 zwGjZYVea@Fesd=Rv?ROE#q=}yfvQEP8*4zoEw4@^Qvw54utUfaR1T6gLmq?c9sON> z>Np6|0hdP_VURy81;`8{ZYS)EpU9-3;huFq)N3r{yP1ZBCHH7=b?Ig6OFK~%!GwtQ z3`RLKe8O&%^V`x=J4%^Oqg4ZN9rW`UQN^rslcr_Utzd-@u-Sm{rphS-y}{k41)Y4E zfzu}IC=J0JmRCV6a3E38nWl1G495grsDDc^H0Fn%^E0FZ=CSHB4iG<6jW1dY`2gUr zF>nB!y@2%rouAUe9m0VQIg$KtA~k^(f{C*Af_tOl=>vz>$>7qh+fPrSD0YVUnTt)? z;@1E0a*#AT{?oUs#bol@SPm0U5g<`AEF^=b-~&4Er)MsNnPsLb^;fL2kwp|$dwiE3 zNc5VDOQ%Q8j*d5vY##)PGXx51s8`0}2_X9u&r(k?s7|AgtW0LYbtlh!KJ;C9QZuz< zq>??uxAI1YP|JpN$+{X=97Cdu^mkwlB={`aUp+Uyu1P139=t%pSVKo7ZGi_v(0z>l zHLGxV%0w&#xvev)KCQ{7GC$nc3H?1VOsYGgjTK;Px(;o0`lerxB<+EJX9G9f8b+)VJdm(Ia)xjD&5ZL45Np?9 zB%oU;z05XN7zt{Q!#R~gcV^5~Y^gn+Lbad7C{UDX2Nznj8e{)TLH|zEc|{a#idm@z z6(zon+{a>FopmQsCXIs*4-dLGgTc)iOhO3r=l?imNUR-pWl!ktO0r_a0Nqo@bu8MzyjSq9zkqPe*`Sxz75rZ zr9X%(=PVqCRB=zfX+_u&*k4#s1k4OV11YgkCrlr6V;vz<{99HKC@qQ+H8xv5)sc63 z69;U4O&{fb5(fN``jJH#3=GHsV56@{d@7`VhA$K^;GU+R-V%%cnmjYs?>c5^6Ugv} zn<}L&i;2`zzW@(kxf$$gVH@7nh}2%G%ciQ_B?r{13?Q@=Q+6msQGtnyY%Gkjeor?g z7F*tMqLdhcq+LCCo^D;CtOACCBhXgK-M&w{*dcUdmtv@XFTofmmpcWKtCn^`#?oZC zUOm52 z7sK$hR|Vh6y&pfIUK&!`8HH*>12$nWA)Ynp+XwOj=jNLD z{QA4gezbe>wiP?`jJO;c&EId;=2u80s_r97;TX!6@*(<%WL+^bmxheMB3pKx0OpH^ zPs}knV+jpJ4TaD@r^V`mTsjf`7!z^H}eHQ#Rp z72(>Dm#QO!ZYR*O@yHic`3*T^t7jc=d`Jz6Lk@Y-bL%cOp_~=#xzIJl?`{Qu;$uC~NkePE+7wSW_FM`&V{gFN zl;lq@;FtAsl!h;tnOvj z#gYx!q$5MdZ0Jxjy=t*q)HFeeyI-vgaGdh1QNhqGRy8qS)|6S0QK7Gj9R?Co{Knh> za>xkQZ0}bBx!9@EUxRBYGm25^G}&j-`0VWX04E|J!kJ8^WoZ(jbhU_twFwWIH32fv zi=pg~(b#ajW=`)Vikwwe39lpML?|sY$?*6*kYBxku_<=#$gfTqQ_F!9F0=OkHnzBo zEwR!H_h|MNjuG$Tj6zaaouO}HYWCF8vN4C%EX-%Iu%ho;q$G#ErnafhXR*4J2Rp5* zhsi0;wlSwE*inVFO>{(8?N~82zijpt+9Y_-^>xnE%T*zk9gi|j7b@s<5{|qEquUD( zS;-%RySZOCOEh*>!kvbsQ265* z>X8*_Wy&~FB@aDHz%glyiAujXq-|2kDUjFTn9Rafsl+XNyFP%PG|l&ZGWBcEXxy=9 zeDn2PIoVuL$gX0RgVK1O$x3%pOzS7x^U5Pi;mtT)%cY;&e&M7GLM}zP+IPbqLt=^5 z7qLfri8myf;~2psc@^cA6mG&{C%e_(M$$!wC^5p^T1QzrS%I?(U{qcd+oJJkQxe10 zON{Q*?iz%F4MbEsoEc+x3E?&2wVR^v3|Q0lDaMvgS7mNjI{2w! z9|~=!83T%GW*iaChSS!`Xd^beFp9N4%K+k*j#jFumk}U?=WKL_kJAltxnxp~+lZzT zp@&&kSPTg3oSGos`rVBhK0|4NdHM_hnKuw1#0JV{gi_dKDJLB+ix~~HpU9%jD)@YY zOK)L7kgbLyN2%Dx#fuY}8swh4ACk7%BpP-n5(RhDq{gEHP*Fo4IviX{C49|B5h~SC zFr`=0)=h2^F5UpCAgt?R5u{6VvpUf#*nC zCQ`$!|C;L2lpjlG?(>T$(_$O3_YNNbPT~(?!j3aD8k=yu^ogw4bkjvgF|3BOq(hB& zG;^cPXmcUP$ox8zElCJ-zMbK9q^8{rri#8Cek5Ydr0YT-KTh@J z6^AcB9ejew8BY5kzZUZX(7Po==eW<(;uV~E7(BY5c0^xr`cuRwn)47bN?zOb!0?cw z#v}R$z66&m#+AHfo@(^V2#S~bhoUkkTArg+6w>JzZ52r96^({1W!?>4$h0l|-jDfj z>7(<+%67#(A|4hZ3>Y;hd&S?}F;`Vtqz|pK&B>NJ=Faci;gkf-+GmfQR8^zo_vul2 zB!)kfu4Dq_g)8TBBo52*sB6F`qa&JCR=_A$QWgX_K}fZm{Cb2#1q`^S3+WaS>sS#@ z-4k*G=#?z6d_e7JJ+Z8^(t0tNdL{K5F;2nfQbXgld}a(X)Gr;WojOy`^?es~AClT$ z5^lD{WJek0!p-QEH5E7n6DKQ0%_ZBZ=|jfV_MM{VmL8y-Wd|>OmeemP=C@xI@@M~1 zW2S*im@Rc=O>V886_UJ@oh1!2H$Ku&U*Hh_oxd{32)vf1$cRiepv28ricM;}#p!+k zaK{z1I=9Y%3m4|Pj*BD*Fn5Vh?O@oD^1UcjyeNh0fbhh~V6xb#4njlGW8OehUe!MnoR(wn#nsoyL1m!Rov)Nv4~&JEVl7L z#^qYdTpNI#u`N0UbVMiDmD>g2VQcG3>4D6gErgddZnSQTs){BExxRJRB?bIxTdZa z;!S8FHJPPiIDQ*FAUiWSYnjILFjDvxvSC zk z=j4Kx@Pg~&2Z?cmMDa;)#xVeorJrxDBqy{+`kG+ZPQqC@#ku-c3ucU+69$#q_*se` z-H#PFW^>-C0>++|6r=<$Z8)ZFaK=ZjwsNYXqRpl9G|yme@Eld5B-*I69Nx_TResHi z!5nm+>6zaJYQO#%D{~o-oOJ;q`fa5}l!8G*U-E$OM&7@dqciBCWtd}|SrDXz$TB($&m*=Epuolu2k`KUwO7maP3P0ok zmF57lSh0Ba@&sO1iZ5^+3s8{B8t|M;Pg&O+{tZJCiLWd6H@{b~9{CLF9s3Kn zt5)Rs9ejne?o{%f>B$Dl%X7fd~KY)I|(pxUeHj;gNsK6;ZR>`ciu;GxvhDUt!+31Knss2U(%ts8K z18)8;<2ax9RG?!|Lwdt^i5L^&O788roKmVAB)=EdK~HqR2Q=)H_VW}xY=95MP_Ov< zPEz3%DRK}+(aUBwsr83H8>`H^v~|A_t}0vPmRwKPt1{|qOY|PZu}j9+{ZhF&-H_TB zU9xWLpNTc`enI|)h9jQeqf5RfGLFk_vfX`40iMpd%KZF!lKbZTdBw$<^G6nuS+$fT zrbK)xo&;buPJcpOZ=x>n+bRXVFDs(23Xr=rDE&!)pVXZ;;A07NXGl_0m`{Z)DQIu$ zFDvY4xu-ifTe_$|n2B83eI;KUg6pVbw+N!nyLj~wnRi{4mNy{WDV)G1!6$y=+x6U{ z%4_9=Q^L!x_gAYp?J3+u5hA5cO8aHeI=6AC8^S{mzhqCBvBLYEutUC(X0>hKg|AvN zvkmJCQNA45_KjW{aEcyrBppcO6G0zTy%v1&@~+2!n?kA9?>0>AjFN|JdCnHQ8$hEU zw#mwGifHppLP?89LMb(Y3Li9iCPx7W%ek}2FgD2YSzjsR4Xj<=zN{Yo@7s7(k%mP4 znT2p&4EQ@q_chd-E z78uvD*C@oba`U3W2Iw`M#`5C8jOHv8^Li<|j^SI>>>`77Dp71Vtz=J?4Zck4SdRbd zfF}C_>Y(#)r@y!Q0`tMlG#b9>5`fAI$B&tWJfbGlYW$J4V+-s=HH!`+;1XeL@USdx zR0$G&&XBf9lQtkH5)p=U!8J!1{oc4E!N-~Abxl6E;;=3-hMYZ+44?u}zabmCE)yB?*_w91m$n1Yskp&@ z;kxeJX-#ioX^{elyLu~gzx|_KxLpX62MF%Axq3$!Z_P`pBWR?zP8OI`PV~6Aa0Oi0 zv_Ot1m&plf-ZF{e(z(Ms3*S5q$e|j;gOwGrmWsCHfLi(h8y?gc$(2H{884C1FvHQQ12tX=qFUsK~zM!W=K>;zaRsu4Xmcc@8nSs!vK+{ z?}bq}-m&p5jRSam67n>yG9ez=I^|J1O;Np8s=P~9MXYLxD+cFQK7PhG=bkjo{Naae zjp3NWWrlFWDb3Z5D07Q|WjZ=wOQ=aKA%en=O@hL$QCKpIXNZE=InFk|Fhq-&H!6&X z*MVy8=hL7Aw&pQjHrFf27C%3B<>FX{@fOLNhUoxL4*@nY}&M3G*T-p67a zo}~_&yGOB)#vbU|Q3FA8S^X)c-yBlmN(_%}`7Ha3uWFe?>9f=3hlO{^gv~$p`v?vk z_P*r43|(S{%ihs;)YH|jAMpP=-Ms7Ne75_YZZiL3CHVjSU`X1|?Ehh&gA=Xn7W7d@ zf8bM9Y>lG!`PWFDDA9G;x*{1Eh^55u66*9D+-4^dYZ{xXP@?sQLVrY%(azM;C^4FuN7CQ%$!3sr1JL=!Be& zuOZL^bLp$Qo2rL=WDzQIls%s!Go z{s}Q0b#+#8bKga|01t%^9Z=wEsevvXM_{$dCR97ed3@1kX)mtSS!JN^rtqKOj}p~> zfpCI@DX*DqcB6ZnBcl~}sGO~1s$AtfkX6fy3N8*ebvZc*KBW;dA=)?#BE&}-or74i zZUt5;{FBPnkZD8YUXDsx&2LvSziAlec3oc>&Lf1Doc3g?H9{OO_$M4B0qTat0UsWP zTlxUeQ3B;oJ%en4n?zQB6*Fb#wH7`$SQN5GI|=DnJKiYm{?-?#-H;#sIjz7kQ4&VW zN9d1(1$_W~S=<%qDD!mwRytas=eqX^iW}YSx3;wJ#)Xp_`Qk1DFiXac$-3;jQbCif zLA-T_s~5yP@Q@W>pXKl^gipQ>gp@HlBB>WDVpW199;V%?N1`U$ovLE;NI2?|_q2~5 zlg>xT9NADWkv5-*FjS~nP^7$k!N2z?dr!)&l0+4xDK7=-6Rkd$+_^`{bVx!5LgC#N z-dv-k@OlYCEvBfcr1*RsNwcV?QT0bm(q-IyJJ$hm2~mq{6zIn!D20k5)fe(+iM6DJ ze-w_*F|c%@)HREgpRrl@W5;_J5vB4c?UW8~%o0)(A4`%-yNk1(H z5CGuzH(uHQ`&j+IRmTOKoJ?#Ct$+1grR|IitpDGt!~ZdqSJ?cOtw-R=EQ+q4UvclH zdX=xlK-fhQKoKCPBoFAZ*(~11O6-tXo>i0w!T$u{lg!#itEUX3V{$S*naW!C@%rll zS{L(1t%xz(*B`{1NL!*aMc<~fE=g;gXi&Gb$HpD!P)8?JzfN;4F&wv(5HH<=c>>)n z({271)xREH89=C(5YKL{mmJJ_d>qHz;;gTvTlgM*vz9@YTTYZ#%_2A zS0G-t9oMQEpvfv(UjfQ8T$vAHi)zOj3>D*{xSRiu3acc=7cvLyD?_ZObdu$5@b*!y zaZ#u?7uF}SrHVQa=sTOhGW{6WUlq#RhPPm^GsRH#qlX8{Kq-i~98l;eq>KdCnWyKl zUu&UWBqu#Tt9jQ97U4}3)&(p2-eCLznXMEm!>i^EMpeVzPg%p;?@O;dJBQQY(vV;d z3v+-3oTPC!2LTUAx^S2t{v;S_h(EZ^0_dS5g^F*m{TEIy^Qal~%mu3h7*o`jWOH}i ztv8M)3X3a*+ry_KkYXYE4dB0?M|t}#Tp+(}6CQ zBbq;xhoHj}b@j-@koDB#XcCY~>_x&Y;i%MH|3tF^X2h{36UCVfQ-;oEA+4ZkJ`^Qi zQf^8}6eFO$Z+Dj-F1wkG##tTx>FjR2oOXFmbKFj6K3+=kePQ<4d7%z5R5cOB;zO6| zm9^m#U4lcA;7t&*=q|a-!`!)}SgYXT#i8hnxtx@kaoBF$QAS-hT7N5kH^l zB^i+})V>L;9_0Qqf-dyF%ky8Mp-dp#%!Nls3vCt}q3QLM3M-(Zs1k}1bqQ9PVU)U` ztE=?;^6=x}_VD%N@${>qhpkU*)AuUBu_cqYiY&@;O$HV*z@~#Tzh?#=CK`=KwBv+o zh%zu%0xPKYtyC)DaQ zpDW}*86g%>BH3IcWMq`g$j()0kWE(qkIL8A&A0mf&+BzxpKF}=`#jG% z&*wa!&pGFLs5_b#QTZE4Bp+})qzyPQ7B4Z7Y*&?0PSX&|FIR;WBP1|coF9ZeP*$9w z!6aJ_3%Sh=HY3FAt8V144|yfu}IAyYHr1OYKIZ51F>_uY^%N#!k~eU53at-_E-Gh?ahmM5y* z+BTIbeH;%v1}Cjo{8d%UeSMWg(nphxEU`sL< zQR~LrTq>Da(FqSP2%&^1ZL#DTo5Sbl9;&57tQ-@U&I#lj)aNSkcfEJwQD!33?anVU z?pw2q7WtMvfji493`rSFnyp7{w87cW`ak=UEYlk5PCB1K6UDVKXyozOChH4yHh~Q< zv>yvKw6WLfi!PZUx60JZcTNM7jo{ww9b8Q+S7C3WA5&llSwdwh$=Q(*(f3ofqcz=nwOmOy z(J!K=*wNoRU*${{Mbwapi9pTB(&VVKefqd-qrUb9*Eyr2E@oZ9Cgf}Mc;QP<0D)R4 zz=!*^VIG4T*7Xl=sJxrWv9hW^eJ%qYp5(d0?E6LZzJ}=7E+1{?GQA;z+!^VBD81}O z0kJ^dKy&WMw+1+aGVYY-v@i28@Gm+sX5=@U%F=Z?W)oar}2~Rc&F|+3A)n-U2GF10+QdxDb^iA@7eL$c7yhBtL z>lABrh^qy9XZ${E1}Ss5!N4;ig0-pUh6@|RPCHOWvgG{|l}2enRgJftsN%D|ck0YO zuAQd2aMPSyGuJ~jm)aY=+p~mGudw4erwE%P^)5f<*$$2C-4^I=e8-}7##ZQ!8!Tep z+Z_!}CAI~sry$|XK$ktXaxP*x<_ijCPp`2=6sNLZU<@9Sz-rz7^BCE9yh0jV4(I!Z zxmA4d;>B-!vD}Xp*&*N%`b^e&R;D97WS}{~{O-EtXeZNfdf51tw!WR6Noo4hjHPv5 z?heYYRSBPjMc}tFEU^|U8a1CxxK%)WTcn9P%`wR^I$QSeMn6=w>Z9OoVvcrl`zYlZ z2y`mAu0bV(Scc>G_EmIo_4 zm*~h`mxYZC&+U>C5G1FZH5L^U>Cq-9UDRQa35jz&NBj*0{uJKfZs5=Fn@&)Xh6aX(H3w9m9BGLePqVotxTeSPh5-mc7$# z-80t6yB0$Nx<54ohdO*QL7m_(&+#*=eoNiYDB4rE4Cag@qfyZS};Fx;Vf1;oync2k z9v#-w?d6R& zOI`CCS_d=tf3|?g3Z}b6-_Rdg3y~enQhmgkni0Cvf9m6%Ft8r;NC5|b%t&?lkl*4{ z8Ui^;Ds^gq6ti(1xB7y_$zA!i-M~#!!tl$ErTR>P~>T=Yky)8(uvPbvLmB=UfoD zrfl}8<1OQrm?8#j1!?s*T>AoectQl&m!o&*^JcIW`_&bk3tN}k^0rjl=HL$z*uIYt z?7l?^Dqr?q1210Sp$xoAy!&{2^{^Anl460 zI&7urrc&|Y{rjv04VOl{y7c82N6xzg5ueYmQ(q(zC3w_C#x*~%yf5j7MI{W`tsoxzA*PrmK)cTskU| zf2C}Bq$>S$-1JgIh0aW@LxI|-8(OGuD#^M01ghh}&#ObO>tZgSw_LW`zdf&IN$YO# z)|X_9m#JwLW5pErZB3ScggKcNzxA9(hyKkK9I#pR&79&*+SV_eu={00{HF=Bb+AEe znaSof+r1jZ!EL5XgqXWkckaFSSyEk}o!%p8XsD}O>borZ6x%X2b&q!s&1-O(>`kZ$ zB2l^5Cx9xQx9)PXN1xPM)@+LxACH_iZ8zGc(>wnFS_O|@hKsxpMjXOzLEa7OvSlM&&G9ioQw9~RsD4F zK7Q+_&|Q6{eZ^8Rx@pKL`le6kH+(fLc{=V&{b%I5=n}VHV4)X_2Y!pYxgC8wU)yP! zPF3t$?(jsC>Ge=&{kmPGUEETpaw(QTAl)m#{qR3_aq9!wK%6XHfV4C>Y^>Z|%ns7j z{Ja?^IA{+@;kR#IjHxkar%3$eJT4?xNBKUVmoO z`A8Zo-{~_;vcikZ(p}EZzU4kO6WPqkMyE{VvS?;44Z@lj zz^fKX9UL!8Wc(9VgI?P4*zpis8dzl};I>yr1>dtXU=FTAlx}Eht4-*7RACL^AflGh zyZb1hTf(~CkMo%#Q%NMgM9tE2D+)joqbtHYA89Ql1nqVTt+MxZ^*FRd&n5YlIi!8m z>$Ysd!l{+C)y;Wa(ZV-=<+NZKV;v4mt}v2m>`v$-$3b;GsLxf= zd~f(rmfpl``{0aVwN7y!>eGyJFP`L+TxHjHTOS{K^$L2`@6(Rli`{EFwpH@R%eZ6g zwf7rc43Yk!=k;{ z-Rn%~B3amGr}}SxfE$vS8FIPL=Qt57$|R#sSoFgdNUT?fYOYjPl%ZBFpi=jq=DWby7Zxm@y;B<89!9= zbgEH*Uy)~iq5kJLX$+ps$kV`#6jW#|9BGz^`ivNeid(wVbk4jl)VBpW&~;eXNi{#` zwx?{DXR~*sqQcFhY0XCfQ4-*2aN1BGX>$_swtKEqnd>j6vcZ!#0)pXRi?<{!P?tGw z2x_`RD$W)qD{?z}VDPt?+)8*rqLWFIPQ(9-VbBdf{7ff?w9CZ{sIi_gnuC$I0(+P8 zms9XB%}VQ>>pve##}jog6+cD?v~n4Pa9Vmc zg#K$|+`adO=B7`uj35Y}6EZ z{dY`x@w8;R-7zrsr1O_~Jvl*|o-x%jF=Rr1C}GXP^|IYN`1sqmG-oI@R#%X66c#5W z$$tQB)sqwiVm;Y^`Dw3mo|firP{*HsOQJre5%Dm^H@we0FN88VWJ0dja?_U38z73f zrCV!b3qNP0kM#%9T!W5`ynGcg%BL28FW1J-J1_S`BJGCaReQ!am(2%qZ3lLgzq|ns z!!fF@`0=*z)J2BwZ*hO|Yu^cI_nF$9l-Pb3jE7=P8gZ#!xiuZ7-cSa`gb`6mxGTgg z-DLdID?M!Z%+hHB#{?&0$GFRpf+_}q<_wbzX6K?w;%6szz1RbySDSr2r^h_qi$khs zXdZ9A0!_Bf)TR2-^-K~q`FQ!#1x(U4VbV%AA@Ei{%cA(EwC{XfjRi?`&9rav5;Q5% zO1`Rn@OA_ZB@N*mC#)?d3P!}Eh;=NgpIKsy{(yr`hv=aouwt@r&P&}Z3DNWo9ro30 zX52~(aTV$*HHlgB66-4GQru!_AZ|)V*I5X=WG)`N@U&D>e@@C#V@JwEL*L`7#$yes z62C^5%Qniaow2$3HrAc7U{qzpb&FA*xLI1JSWR@`RF=JCcvTI)%dH7;sWInt9JLu# z|Ao|Q?K)cDg_JKsym=joo5gR80wtv01N`um1nQ@Ms0Y*bVzxL34} zo?gizp?`=Y{*W>^Hy2%Jl)y?A+&7s1UVHFixuIy~sawXjcDCL`129cK7|ZQS0u;A} zTJC#WNmqkIrnHpAhHVcM(U^vJA~dl@jf_bs*3?i+=&vuC?Aiy_pcB~=1syDni4 zw+FLuz>F773u#$;NUQ9WDtUPY@+rA3WBhQdKFKOyzkA(URa7;4tW>3jQIfi8v0h3g zJC_HVDXS#>DWb|&se7FHnr=q&l#xg9o02}}u=b-R>@sw={Z zHF*?t2FmhqZ=|qa>x=A!*$S+0T zhO*D*M?NTf-eX`eO)9TIQu{7Dm77Acnj4b1jI9@c*ZL8wL%8kLEhd$KM8=Y!fbN@9 zC7B5#y>JM1n5M)!&im==EgHs2j+xCZG~+~QWCi?s!QyFo2kqx{%jE2n3^N*Ayz6Lp zhg5g^3# z+5FoJ@$u@9WJgPKpUWEd4}4AK9TJKU8W%ms!d0p%OIOX+bY+55zl!vIaz$XFI9Ep+ z;bL_}7PDI2Y`Ng*XY(65 zh0%`@Lve%fc;)N4_g12bNrt6gH=N#OHtxO`$lpWlw=Z6MF+E@;>GkZ#lAZTn`aHwf z&I1|aV#b_VHMIgBN*RzU9i@Z@m}0i>o?({&%fpEfaOpFeaJ7V37;m0?kzd}}Lk@9$ zL}8TEo7WZAcRi%zFZxkr6<0k#X-;lTD`Oc~cDb@olwgWCewvk{GJ}hCXbF!AdiLpd z|Cck$ZTKI?Ack{34Lva7+k=H8K2HTZiurox6F+>dy+@R9T^awxj590D$|kXUg+Ygc z(f)jlRwN(4z$#%PnOVc;#Fv{nAi{#UcXPNcmP#5O{zh_*`=q^JCeia{sN4zHjk2*y zqUVh{Ya{j>SPmP^i#Qfcq_MTqo8g52Fi^F zKBc$$HVI!xFx*4Y9l+nt)$AoZORD}%5I10oI3kx`-N30QueiwIw#0VV2E*Fb-nKW% z=+r^hos`Y-7~{cA1FVbK$_=~*z53+Q8KGjg;>ztg((H12%QTf4OYU8y)C}h5yo#$% z&Q$`vMM*g?ZcatAn2j!hFv8KuN(dw)T*}sF#THDHxo8xC^?vJ zc`U6bVo~hOr6I!8*GTZ<^D~;unKjK=!IR|GB4E>Mcvt*2GK);93jIDd<(nNjHO z4Hi@2^%Uyx=^Z~5eZ!5rO5%4H|eFoNjD#+Kcu%_57zZb4Z@Ak#X6txD^{U3wBl^r+W- zLorkK;uc;NgTj7dGxHQS+@T*T>Q*j4^Ll$ejQqWrwcHyG9y%Mk%m8nBVG5hvSaYm5 zJN^#-Q46kZG)@T8n2^QCjxIwxUVi%s>EY`E?#@_(A~njFrTiDq;8v|W-1jT|ROlNI zU$h|YoD4PVTE^&NC6_m{EAFBVqsM`P*`-AcDGWQygURzM32Xeq2xng~XQsYeTZ5v$ zQLaa2M_Iplw}4eL6fLPu`6`PYcVMysO>`{8CB~glD=TX7?JZcHfHNmykBM?QD)#D) zGp>R*<^D?WhFQKRc^}22l6F=D2RPrxaX2ZF!b1X0XF*d4%=!sbNcS1q2WOUE(7e4$ z^L8f;F)__d3>&KQFE8%$I4h^y5FYBfB&fWzn71_OSrPe-DHV{O#Q;GP z+Tw!J?eVjX19RKH?*hKQWQt8r7B#lYX8xoSHFGCW-*DSQ4EM4M3Mw%gkSYNK18@(e zfzMF}WWaCyS@1y%-~Xg0ry~tkQkUmKuI5lGAua{{vn22V!2T()AU5FpKh@Nv)s^Js zv~@VuUG;=CnLmQR{PeUBQf2;lAV!vG>^Z0N zL88rrjL-*J!43;7C=w9xhcw`yjRKq7o4L9=0SmR9PA-nX12@#h(iIu-0N_xm2OV)( zU_raT0y>$wm^oMi2|U3N;OhF9uy}`<-xVka#DV*l{O0yHzi9vUxa1Qtpi$buR*8cU zd4~lS1pT$L^!0=6qUKOpM+XPsy{f7W#1bjrEwaeN!Ik9(zySIT^pEHvHgJUneFN4) zk=k|$55(g8slmS|@+*4fr2urd3LwjIIZA**g+%l(SZNn4HwQ}y6o`vw>2&mR1X+&q zDa1Af0B;4rAMZMOlHbAqK|R_xuwJ7ANARtFE({-P2o{tJJR<>2KVp)ZK-M;)ejx zd*E~Mka<{OL7%CAhk4n|1qg?97-I!l0rOinjVi#arbgg4bi5;nY5oFL`UWtPk5&L#grSxv zE3!}=1px!ZTLT90aYc^s`~{VojjJml&<`@e41dFP+XU6D0AOkbn2rlI3>^LcqauG& zc$m3Z{!u8LvUrm^fT{qX5yD9{?r(CCiUdck%!T`KIZd2oQJz1joB&M(Teg_>;yS<2-5>BWfSPpG`Rt{!j6>kqMAvl^zk0JUEfy$HVJMkxP-GkwZuxL62me2#pj_5*ZIU zP~#C^OZLfl$HO)v;~~c&JHivn|1I9H5y_CDkt0JLLGKm(4*KLVhJ2jh2#vJuM6`b& zE==-lvME^Oj022xF&IV*? '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - if ! command -v java >/dev/null 2>&1 - then - die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat deleted file mode 100644 index 6689b85..0000000 --- a/android/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/android/settings.gradle b/android/settings.gradle deleted file mode 100644 index 3b4431d..0000000 --- a/android/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -include ':app' -include ':capacitor-cordova-android-plugins' -project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/') - -apply from: 'capacitor.settings.gradle' \ No newline at end of file diff --git a/android/variables.gradle b/android/variables.gradle deleted file mode 100644 index 8ef305d..0000000 --- a/android/variables.gradle +++ /dev/null @@ -1,16 +0,0 @@ -ext { - minSdkVersion = 22 - compileSdkVersion = 34 - targetSdkVersion = 34 - androidxActivityVersion = '1.8.0' - androidxAppCompatVersion = '1.6.1' - androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.12.0' - androidxFragmentVersion = '1.6.2' - coreSplashScreenVersion = '1.0.1' - androidxWebkitVersion = '1.9.0' - junitVersion = '4.13.2' - androidxJunitVersion = '1.1.5' - androidxEspressoCoreVersion = '3.5.1' - cordovaAndroidVersion = '10.1.1' -} \ No newline at end of file From 396e5297c2b2bf17b13b11a292ec9a17f26d4cfc Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 16:05:48 +0200 Subject: [PATCH 05/39] Fix missing bracket --- src/App.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/App.tsx b/src/App.tsx index 1c6913a..3ad6fe2 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -289,7 +289,6 @@ export const isMainWindow = true; function App() { const [extState, setExtstate] = useState('not-authenticated'); const [desktopViewMode, setDesktopViewMode] = useState('home'); - const [backupjson, setBackupjson] = useState(null); const [rawWallet, setRawWallet] = useState(null); const [ltcBalanceLoading, setLtcBalanceLoading] = useState(false); @@ -2018,7 +2017,7 @@ function App() { setIsOpenDrawerProfile={setIsOpenDrawerProfile} userInfo={userInfo} /> - renderProfile() + {renderProfile()} )} From 58eb704dcd6c49abf367db2fd9aac6ddd735b8a7 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 16:06:04 +0200 Subject: [PATCH 06/39] Set correct property --- src/assets/Icons/Download.tsx | 2 +- src/assets/Icons/Logout.tsx | 2 +- src/assets/Icons/NavAdd.tsx | 2 +- src/assets/Icons/NavCloseTab.tsx | 4 ++-- src/assets/Icons/NavMoreMenu.tsx | 2 +- src/assets/Icons/Return.tsx | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/assets/Icons/Download.tsx b/src/assets/Icons/Download.tsx index 28ac605..a8498db 100644 --- a/src/assets/Icons/Download.tsx +++ b/src/assets/Icons/Download.tsx @@ -25,7 +25,7 @@ export const Download: React.FC = ({ clipRule="evenodd" d="M12.8047 0.393196V7.21185H16.3036L10.0003 13.5139L3.69697 7.21185H7.19584V0H12.8045L12.8047 0.393196ZM2.7047 16.8587V13.9861H0V18.6179C0 19.3774 0.622589 20 1.38213 20H18.6179C19.3774 20 20 19.3774 20 18.6179V13.9861H17.2962V17.2963L2.70461 17.2954L2.7047 16.8587Z" fill={setColor} - fill-opacity={setOpacity} + fillOpacity={setOpacity} /> ); diff --git a/src/assets/Icons/Logout.tsx b/src/assets/Icons/Logout.tsx index f7d9c57..b15d0f4 100644 --- a/src/assets/Icons/Logout.tsx +++ b/src/assets/Icons/Logout.tsx @@ -21,7 +21,7 @@ export const Logout: React.FC = ({ color, opacity, ...children }) => { clipRule="evenodd" d="M7.56485 0H16.3611C17.2662 0 18 0.727797 18 1.62558V18.3744C18 19.2722 17.2662 20 16.3611 20H7.56485C6.65969 20 5.92593 19.2722 5.92593 18.3744V12.6013H10.6168C11.4569 12.6013 12.1404 11.9039 12.1404 11.0467V8.87329C12.1404 8.01613 11.4569 7.31875 10.6168 7.31875H5.92593V1.62558C5.92593 0.727797 6.65969 0 7.56485 0ZM11.1667 11.0467C11.1667 11.3719 10.9205 11.6354 10.6168 11.6354H4.8144C4.74521 11.6354 4.68911 11.6955 4.68911 11.7696V12.8632C4.68911 13.3492 4.17007 13.6259 3.8078 13.3329L0.218431 10.4298C-0.0728102 10.1942 -0.0728102 9.72579 0.218431 9.49024L3.8078 6.58709C4.17005 6.29409 4.68911 6.57077 4.68911 7.05684V8.1504C4.68911 8.2245 4.74521 8.28454 4.8144 8.28454H10.6168C10.9205 8.28454 11.1667 8.54813 11.1667 8.87329V11.0467Z" fill={setColor} - fill-opacity={setOpacity} + fillOpacity={setOpacity} /> ); diff --git a/src/assets/Icons/NavAdd.tsx b/src/assets/Icons/NavAdd.tsx index dd45bad..c234be2 100644 --- a/src/assets/Icons/NavAdd.tsx +++ b/src/assets/Icons/NavAdd.tsx @@ -25,7 +25,7 @@ export const NavAdd: React.FC = ({ color, opacity, ...children }) => { ); diff --git a/src/assets/Icons/NavCloseTab.tsx b/src/assets/Icons/NavCloseTab.tsx index 8b2734e..6062175 100644 --- a/src/assets/Icons/NavCloseTab.tsx +++ b/src/assets/Icons/NavCloseTab.tsx @@ -32,14 +32,14 @@ export const NavCloseTab: React.FC = ({ stroke={theme.palette.text.primary} stroke-width="2" fill={setColor} - fill-opacity={setOpacity} + fillOpacity={setOpacity} /> ); diff --git a/src/assets/Icons/NavMoreMenu.tsx b/src/assets/Icons/NavMoreMenu.tsx index ca641ba..2916f49 100644 --- a/src/assets/Icons/NavMoreMenu.tsx +++ b/src/assets/Icons/NavMoreMenu.tsx @@ -23,7 +23,7 @@ export const NavMoreMenu: React.FC = ({ ); diff --git a/src/assets/Icons/Return.tsx b/src/assets/Icons/Return.tsx index df0abad..81a6690 100644 --- a/src/assets/Icons/Return.tsx +++ b/src/assets/Icons/Return.tsx @@ -20,7 +20,7 @@ export const Return: React.FC = ({ color, opacity, ...children }) => { clipRule="evenodd" d="M2.645 5.81803H15C15.9471 5.81803 16.8557 6.20131 17.5257 6.88278C18.195 7.56497 18.5714 8.49007 18.5714 9.45445V10.909C18.5714 11.8734 18.195 12.7985 17.5257 13.4807C16.8557 14.1622 15.9471 14.5454 15 14.5454C12.0164 14.5454 8.57143 14.5454 8.57143 14.5454C8.17714 14.5454 7.85714 14.8713 7.85714 15.2727C7.85714 15.6742 8.17714 16 8.57143 16H15C16.3264 16 17.5979 15.464 18.5357 14.5091C19.4736 13.5541 20 12.2596 20 10.909C20 10.4268 20 9.93664 20 9.45445C20 8.10461 19.4736 6.80932 18.5357 5.8544C17.5979 4.9002 16.3264 4.36347 15 4.36347H2.645L6.17929 1.27906C6.47857 1.01797 6.51286 0.55832 6.25643 0.253588C6 -0.0511433 5.54857 -0.0860541 5.24929 0.175041L0.249285 4.53874C0.0914279 4.67692 0 4.87838 0 5.09075C0 5.30312 0.0914279 5.50458 0.249285 5.64276L5.24929 10.0065C5.54857 10.2676 6 10.2326 6.25643 9.92791C6.51286 9.62318 6.47857 9.16353 6.17929 8.90244L2.645 5.81803Z" fill={setColor} - fill-opacity={opacity} + fillOpacity={opacity} /> ); From 27858d3df2fa4d86bd87da9b6ce40c4f4c85f396 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 16:13:45 +0200 Subject: [PATCH 07/39] Set correct format for msOverflowStyle property --- src/components/Apps/AppViewerContainer.tsx | 2 +- src/components/Apps/AppsCategoryDesktop.tsx | 4 ++-- src/components/Apps/AppsLibraryDesktop.tsx | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/Apps/AppViewerContainer.tsx b/src/components/Apps/AppViewerContainer.tsx index aa60a6c..daa3a7e 100644 --- a/src/components/Apps/AppViewerContainer.tsx +++ b/src/components/Apps/AppViewerContainer.tsx @@ -19,7 +19,7 @@ const AppViewerContainer = React.forwardRef( padding: 0; } * { - -msOverflowStyle: none; /* IE and Edge */ + msOverflowStyle: 'none', /* IE and Edge */ scrollbar-width: none; /* Firefox */ } *::-webkit-scrollbar { diff --git a/src/components/Apps/AppsCategoryDesktop.tsx b/src/components/Apps/AppsCategoryDesktop.tsx index fbad9a7..754630e 100644 --- a/src/components/Apps/AppsCategoryDesktop.tsx +++ b/src/components/Apps/AppsCategoryDesktop.tsx @@ -68,7 +68,7 @@ const ScrollerStyled = styled('div')({ scrollbarWidth: 'none', // Hide scrollbar for IE and older Edge - '-msOverflowStyle': 'none', + msOverflowStyle: 'none', }); const StyledVirtuosoContainer = styled('div')({ @@ -87,7 +87,7 @@ const StyledVirtuosoContainer = styled('div')({ scrollbarWidth: 'none', // Hide scrollbar for IE and older Edge - '-msOverflowStyle': 'none', + msOverflowStyle: 'none', }); export const AppsCategoryDesktop = ({ diff --git a/src/components/Apps/AppsLibraryDesktop.tsx b/src/components/Apps/AppsLibraryDesktop.tsx index 62c3bec..73ac307 100644 --- a/src/components/Apps/AppsLibraryDesktop.tsx +++ b/src/components/Apps/AppsLibraryDesktop.tsx @@ -76,7 +76,7 @@ const ScrollerStyled = styled('div')({ scrollbarWidth: 'none', // Hide scrollbar for IE and older Edge - '-msOverflowStyle': 'none', + msOverflowStyle: 'none', }); const StyledVirtuosoContainer = styled('div')({ @@ -95,7 +95,7 @@ const StyledVirtuosoContainer = styled('div')({ scrollbarWidth: 'none', // Hide scrollbar for IE and older Edge - '-msOverflowStyle': 'none', + msOverflowStyle: 'none', }); export const AppsLibraryDesktop = ({ From 510d8037b397cb825c7f64044106291b5ef56355 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Sun, 20 Apr 2025 16:15:17 +0200 Subject: [PATCH 08/39] Remove unused method --- src/components/PasswordField/PasswordField.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/PasswordField/PasswordField.tsx b/src/components/PasswordField/PasswordField.tsx index 31f0a49..b59538e 100644 --- a/src/components/PasswordField/PasswordField.tsx +++ b/src/components/PasswordField/PasswordField.tsx @@ -4,7 +4,6 @@ import { TextField, TextFieldProps, styled, - useTheme, } from '@mui/material'; import { forwardRef, useState } from 'react'; import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; @@ -52,7 +51,6 @@ export const CustomInput = styled(TextField)(({ theme }) => ({ export const PasswordField = forwardRef( ({ ...props }, ref) => { const [canViewPassword, setCanViewPassword] = useState(false); - const theme = useTheme(); return ( Date: Sun, 20 Apr 2025 16:28:47 +0200 Subject: [PATCH 09/39] Refactor style with theme --- src/components/GeneralNotifications.tsx | 44 ++++++++++++++----------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/src/components/GeneralNotifications.tsx b/src/components/GeneralNotifications.tsx index 3235fbb..97c498b 100644 --- a/src/components/GeneralNotifications.tsx +++ b/src/components/GeneralNotifications.tsx @@ -43,7 +43,13 @@ export const GeneralNotifications = ({ address }) => { > + PAYMENT NOTIFICATION } @@ -53,13 +59,13 @@ export const GeneralNotifications = ({ address }) => { slotProps={{ tooltip: { sx: { - color: '#ffffff', - backgroundColor: '#444444', + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.default, }, }, arrow: { sx: { - color: '#444444', + color: theme.palette.text.primary, }, }, }} @@ -68,9 +74,7 @@ export const GeneralNotifications = ({ address }) => { sx={{ color: hasNewPayment ? 'var(--unread)' - : theme.palette.mode === 'dark' - ? 'rgb(209, 209, 209)' - : 'rgba(41, 41, 43, 1)', + : theme.palette.text.primary, }} /> @@ -88,14 +92,14 @@ export const GeneralNotifications = ({ address }) => { > {!hasNewPayment && ( @@ -110,12 +114,12 @@ export const GeneralNotifications = ({ address }) => { {hasNewPayment && ( { setAnchorEl(null); @@ -124,18 +128,18 @@ export const GeneralNotifications = ({ address }) => { > { />{' '} {formatDate(latestTx?.timestamp)} + { > {latestTx?.amount} + Date: Sun, 20 Apr 2025 16:54:13 +0200 Subject: [PATCH 10/39] Remove custom icons and use the MUI material icons --- src/App.tsx | 137 +++++++++++++++----------------- src/assets/Icons/Download.tsx | 32 -------- src/assets/Icons/Logout.tsx | 28 ------- src/assets/Icons/LogoutIcon.tsx | 18 ----- 4 files changed, 66 insertions(+), 149 deletions(-) delete mode 100644 src/assets/Icons/Download.tsx delete mode 100644 src/assets/Icons/Logout.tsx delete mode 100644 src/assets/Icons/LogoutIcon.tsx diff --git a/src/App.tsx b/src/App.tsx index 3ad6fe2..7d3a7c7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -29,13 +29,12 @@ import { decryptStoredWallet } from './utils/decryptWallet'; import { CountdownCircleTimer } from 'react-countdown-circle-timer'; import Logo1Dark from './assets/svgs/Logo1Dark.svg'; import RefreshIcon from '@mui/icons-material/Refresh'; +import DownloadIcon from '@mui/icons-material/Download'; import Copy from './assets/svgs/Copy.svg'; import ltcLogo from './assets/ltc.png'; import PersonSearchIcon from '@mui/icons-material/PersonSearch'; import qortLogo from './assets/qort.png'; import { CopyToClipboard } from 'react-copy-to-clipboard'; -import { Download } from './assets/Icons/Download.tsx'; -import { Logout } from './assets/Icons/Logout.tsx'; import { Return } from './assets/Icons/Return.tsx'; import WarningIcon from '@mui/icons-material/Warning'; import Success from './assets/svgs/Success.svg'; @@ -73,6 +72,7 @@ import { TaskManager } from './components/TaskManager/TaskManager.tsx'; import { useModal } from './common/useModal'; import { CustomizedSnackbars } from './components/Snackbar/Snackbar'; import SettingsIcon from '@mui/icons-material/Settings'; +import LogoutIcon from '@mui/icons-material/Logout'; import HelpIcon from '@mui/icons-material/Help'; import { cleanUrl, @@ -1538,46 +1538,43 @@ function App() { > - - LOG OUT - - } - placement="left" - arrow - sx={{ fontSize: '24' }} - slotProps={{ - tooltip: { - sx: { - color: theme.palette.text.primary, - backgroundColor: theme.palette.background.default, - }, - }, - arrow: { - sx: { - color: theme.palette.text.primary, - }, - }, + { + logoutFunc(); + setIsOpenDrawerProfile(false); }} > - + LOGOUT + + } + placement="left" + arrow + sx={{ fontSize: '24' }} + slotProps={{ + tooltip: { + sx: { + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.default, + }, + }, + arrow: { + sx: { + color: theme.palette.text.primary, + }, + }, }} - onClick={() => { - logoutFunc(); - setIsOpenDrawerProfile(false); - }} - /> - + > + + + @@ -1888,41 +1885,39 @@ function App() { )} - - BACKUP WALLET - - } - placement="left" - arrow - sx={{ fontSize: '24' }} - slotProps={{ - tooltip: { - sx: { - color: theme.palette.text.primary, - backgroundColor: theme.palette.background.default, - }, - }, - arrow: { - sx: { - color: theme.palette.text.primary, - }, - }, + + { + setExtstate('download-wallet'); + setIsOpenDrawerProfile(false); }} > - + BACKUP WALLET + + } + placement="left" + arrow + sx={{ fontSize: '24' }} + slotProps={{ + tooltip: { + sx: { + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.default, + }, + }, + arrow: { + sx: { + color: theme.palette.text.primary, + }, + }, }} - onClick={() => { - setExtstate('download-wallet'); - setIsOpenDrawerProfile(false); - }} - /> - + > + + + diff --git a/src/assets/Icons/Download.tsx b/src/assets/Icons/Download.tsx deleted file mode 100644 index a8498db..0000000 --- a/src/assets/Icons/Download.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { useTheme } from '@mui/material'; -import { SVGProps } from './interfaces'; - -export const Download: React.FC = ({ - color, - opacity, - ...children -}) => { - const theme = useTheme(); - - const setColor = color ? color : theme.palette.text.primary; - const setOpacity = opacity ? opacity : 1; - - return ( - - - - ); -}; diff --git a/src/assets/Icons/Logout.tsx b/src/assets/Icons/Logout.tsx deleted file mode 100644 index b15d0f4..0000000 --- a/src/assets/Icons/Logout.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { useTheme } from '@mui/material'; -import { SVGProps } from './interfaces'; - -export const Logout: React.FC = ({ color, opacity, ...children }) => { - const theme = useTheme(); - - const setColor = color ? color : theme.palette.text.primary; - const setOpacity = opacity ? opacity : 1; - - return ( - - - - ); -}; diff --git a/src/assets/Icons/LogoutIcon.tsx b/src/assets/Icons/LogoutIcon.tsx deleted file mode 100644 index d1a4408..0000000 --- a/src/assets/Icons/LogoutIcon.tsx +++ /dev/null @@ -1,18 +0,0 @@ -export const LogoutIcon = ({ color, height = 20, width = 18 }) => { - return ( - - - - ); -}; From f065c2b07acc5a2941d6ad9a2c290b7bc5eb8d72 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 09:51:46 +0200 Subject: [PATCH 11/39] Add react-i18next dependencies --- package-lock.json | 151 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 4 ++ 2 files changed, 152 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e2803b..b98590c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -56,6 +56,9 @@ "emoji-picker-react": "^4.12.0", "file-saver": "^2.0.5", "html-to-text": "^9.0.5", + "i18next": "^25.0.1", + "i18next-browser-languagedetector": "^8.0.5", + "i18next-http-backend": "^3.0.2", "jssha": "3.3.1", "lit": "^3.2.1", "lodash": "^4.17.21", @@ -69,6 +72,7 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-frame-component": "^5.2.7", + "react-i18next": "^15.4.1", "react-infinite-scroller": "^1.2.6", "react-intersection-observer": "^9.13.0", "react-json-view-lite": "^2.0.1", @@ -1479,9 +1483,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -8044,6 +8049,15 @@ "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==" }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -10680,6 +10694,15 @@ "node": ">=18" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/html-to-text": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/html-to-text/-/html-to-text-9.0.5.tgz", @@ -10774,6 +10797,55 @@ "ms": "^2.0.0" } }, + "node_modules/i18next": { + "version": "25.0.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-25.0.1.tgz", + "integrity": "sha512-8S8PyZbrymJZn3DaN70/34JYWNhsqrU6yA4MuzcygJBv+41dgNMocEA8h+kV1P7MCc1ll03lOTOIXE7mpNCicw==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.10" + }, + "peerDependencies": { + "typescript": "^5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/i18next-browser-languagedetector": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/i18next-browser-languagedetector/-/i18next-browser-languagedetector-8.0.5.tgz", + "integrity": "sha512-OstebRKqKiQw8xEvQF5aRyUujsCatanj7Q9eo5iiH2gJpoXGZ7483ol3sVBwfqbobTQPNH1J+NAyJ1aCQoEC+w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, + "node_modules/i18next-http-backend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/i18next-http-backend/-/i18next-http-backend-3.0.2.tgz", + "integrity": "sha512-PdlvPnvIp4E1sYi46Ik4tBYh/v/NbYfFFgTjkwFl0is8A18s7/bx9aXqsrOax9WUbeNS6mD2oix7Z0yGGf6m5g==", + "license": "MIT", + "dependencies": { + "cross-fetch": "4.0.0" + } + }, "node_modules/iconv-corefoundation": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", @@ -12891,6 +12963,48 @@ "semver": "^7.3.5" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-fetch/node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, + "node_modules/node-fetch/node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/node-fetch/node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/node-gyp": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.4.1.tgz", @@ -16533,6 +16647,28 @@ "react-dom": ">= 16.3" } }, + "node_modules/react-i18next": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.4.1.tgz", + "integrity": "sha512-ahGab+IaSgZmNPYXdV1n+OYky95TGpFwnKRflX/16dY04DsYYKHtVLjeny7sBSCREEcoMbAgSkFiGLF5g5Oofw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.25.0", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-infinite-scroller": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/react-infinite-scroller/-/react-infinite-scroller-1.2.6.tgz", @@ -19462,6 +19598,15 @@ } } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", diff --git a/package.json b/package.json index 7e08596..3e37c8f 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,9 @@ "emoji-picker-react": "^4.12.0", "file-saver": "^2.0.5", "html-to-text": "^9.0.5", + "i18next": "^25.0.1", + "i18next-browser-languagedetector": "^8.0.5", + "i18next-http-backend": "^3.0.2", "jssha": "3.3.1", "lit": "^3.2.1", "lodash": "^4.17.21", @@ -74,6 +77,7 @@ "react-dom": "^18.2.0", "react-dropzone": "^14.2.3", "react-frame-component": "^5.2.7", + "react-i18next": "^15.4.1", "react-infinite-scroller": "^1.2.6", "react-intersection-observer": "^9.13.0", "react-json-view-lite": "^2.0.1", From 655c99091712b6f098fb6bc97d890c3fb45b7875 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 10:53:42 +0200 Subject: [PATCH 12/39] Add i18n section --- README.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 25f4e90..8e12f3e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Qortal Hub - Desktop Interface for Qortal -Qortal Hub is the newest interface for Qortal, part of the 'Qortal Trifecta' series of new User Interfaces for the platform/network. +Qortal Hub is the newest interface for Qortal, part of the 'Qortal Trifecta' series of new User Interfaces for the platform/network. It is likely that Qortal Hub will become the new 'primary interface' for Qortal, and that the primary development focus surrounding Qortal Interface development, will be focused here instead of the previous 'qortal-ui' repo. @@ -8,14 +8,17 @@ It is likely that Qortal Hub will become the new 'primary interface' for Qortal, Qortal Hub came along with the new Group Encryption methodologies applied, which provide **encrypted chat in Q-Chat for private groups.** Qortal Hub was the first to implement the new method of group encryption, which allows new users to see previously published data, unlike the previous group encryption methodology of things like 'threads' in Q-Mail. -Allowing new users to view older messages also comes along with a massive boost to the usability of the group encryption, and as such has been leveraged in multiple places inside Qortal Hub, Qortal Extension, and Qortal Go. +Allowing new users to view older messages also comes along with a massive boost to the usability of the group encryption, and as such has been leveraged in multiple places inside Qortal Hub, Qortal Extension, and Qortal Go. ## Ease of Use Expanded -Qortal Hub has a focus on ease of use for new users. Providing both the ability to utlilize Qortal without needing to run a local node (though running a local node is still the recommended method to access Qortal), and multiple built-in (QDN-published) walk-thru videos (by Qortal Justin) that explain the various basics of any given section of the application. This allows new users to 'jump right in' to utilizing Qortal Hub, and Qortal overall, in a much more streamlined fashion than that which was previously required by the 'legacy UI' (qortal-ui). +Qortal Hub has a focus on ease of use for new users. Providing both the ability to utlilize Qortal without needing to run a local node (though running a local node is still the recommended method to access Qortal), and multiple built-in (QDN-published) walk-thru videos (by Qortal Justin) that explain the various basics of any given section of the application. This allows new users to 'jump right in' to utilizing Qortal Hub, and Qortal overall, in a much more streamlined fashion than that which was previously required by the 'legacy UI' (qortal-ui). -Leveraging a redundant set of publicly accessible nodes provided by crowetic, Qortal Hub, Qortal Go, and Qortal Extension, all allow the use of Qortal without running a node, making it very simple to 'install and go' and start making use of the extensive functionality provided within the Qortal Ecosystem. +Leveraging a redundant set of publicly accessible nodes provided by crowetic, Qortal Hub, Qortal Go, and Qortal Extension, all allow the use of Qortal without running a node, making it very simple to 'install and go' and start making use of the extensive functionality provided within the Qortal Ecosystem. Many additional details and a fully featured wiki will be created over time. Reach out on the chat on https://qortal.dev or in any of the community locations for Qortal, if you have any issues. Thank you! +## Internationalization (i18n) +Qortal-Hub supports internationalization (i18n) using [i18next](https://www.i18next.com/), allowing seamless translation of UI text into multiple languages. +The setup includes modularized translation files, language detection, and runtime language switching. From d2a82519ad8838dd330cafdd273aa75e7b8b8c6c Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 12:14:51 +0200 Subject: [PATCH 13/39] Add i18n and some languages --- README.md | 3 +- i18n.js | 48 ++++++++++++++++++++++++++++++ package-lock.json | 10 +++++++ package.json | 1 + public/locales/en/auth.json | 10 +++++++ public/locales/en/core.json | 9 ++++++ public/locales/it/auth.json | 10 +++++++ public/locales/it/core.json | 9 ++++++ src/ExtStates/NotAuthenticated.tsx | 21 ++++++++----- src/main.tsx | 1 + 10 files changed, 113 insertions(+), 9 deletions(-) create mode 100644 i18n.js create mode 100644 public/locales/en/auth.json create mode 100644 public/locales/en/core.json create mode 100644 public/locales/it/auth.json create mode 100644 public/locales/it/core.json diff --git a/README.md b/README.md index 8e12f3e..4a62e6d 100644 --- a/README.md +++ b/README.md @@ -21,4 +21,5 @@ Many additional details and a fully featured wiki will be created over time. Rea ## Internationalization (i18n) Qortal-Hub supports internationalization (i18n) using [i18next](https://www.i18next.com/), allowing seamless translation of UI text into multiple languages. -The setup includes modularized translation files, language detection, and runtime language switching. +The setup includes modularized translation files, language detection, context and runtime language switching. +Files with translation are in `public/locales/` folder. diff --git a/i18n.js b/i18n.js new file mode 100644 index 0000000..09886c5 --- /dev/null +++ b/i18n.js @@ -0,0 +1,48 @@ +import { initReactI18next } from 'react-i18next'; +import HttpBackend from 'i18next-http-backend'; +import LocalStorageBackend from 'i18next-localstorage-backend'; +import HttpApi from 'i18next-http-backend'; +import i18n from 'i18next'; +import LanguageDetector from 'i18next-browser-languagedetector'; + +// Detect environment +const isDev = process.env.NODE_ENV === 'development'; + +// Register custom postProcessor: it capitalizes the first letter of a translation- +// Usage: +// t('greeting', { postProcess: 'capitalize' }) +const capitalize = { + type: 'postProcessor', + name: 'capitalize', + process: (value, key, options, translator) => { + return value.charAt(0).toUpperCase() + value.slice(1); + }, +}; + +i18n + .use(HttpApi) + .use(LanguageDetector) + .use(initReactI18next) + .use(capitalize) + .init({ + debug: isDev, + fallbackLng: 'en', + ns: ['auth', 'core'], + supportedLngs: ['en', 'it', 'fr', 'es'], + backend: { + backends: [LocalStorageBackend, HttpBackend], + backendOptions: [ + { + expirationTime: 7 * 24 * 60 * 60 * 1000, // 7 days + }, + { + loadPath: '/locales/{{lng}}/{{ns}}.json', + }, + ], + }, + interpolation: { + escapeValue: false, + }, + }); + +export default i18n; diff --git a/package-lock.json b/package-lock.json index b98590c..071586f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,6 +59,7 @@ "i18next": "^25.0.1", "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", + "i18next-localstorage-backend": "^4.2.0", "jssha": "3.3.1", "lit": "^3.2.1", "lodash": "^4.17.21", @@ -10846,6 +10847,15 @@ "cross-fetch": "4.0.0" } }, + "node_modules/i18next-localstorage-backend": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/i18next-localstorage-backend/-/i18next-localstorage-backend-4.2.0.tgz", + "integrity": "sha512-vglEQF0AnLriX7dLA2drHnqAYzHxnLwWQzBDw8YxcIDjOvYZz5rvpal59Dq4In+IHNmGNM32YgF0TDjBT0fHmA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.22.15" + } + }, "node_modules/iconv-corefoundation": { "version": "1.1.7", "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", diff --git a/package.json b/package.json index 3e37c8f..0060144 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "i18next": "^25.0.1", "i18next-browser-languagedetector": "^8.0.5", "i18next-http-backend": "^3.0.2", + "i18next-localstorage-backend": "^4.2.0", "jssha": "3.3.1", "lit": "^3.2.1", "lodash": "^4.17.21", diff --git a/public/locales/en/auth.json b/public/locales/en/auth.json new file mode 100644 index 0000000..2c0bd67 --- /dev/null +++ b/public/locales/en/auth.json @@ -0,0 +1,10 @@ +{ + "account_many": "accounts", + "account_one": "account", + "advanced_users": "for advanced users", + "create_account": "create account", + "welcome": "Welcome to", + "use_local_node": "use local node", + "change_apikey": "change API key", + "choose_custom_node": "choose custom node" +} diff --git a/public/locales/en/core.json b/public/locales/en/core.json new file mode 100644 index 0000000..d8f5ca1 --- /dev/null +++ b/public/locales/en/core.json @@ -0,0 +1,9 @@ +{ + "add": { + "task": "Add task" + }, + "cancel": "Cancel", + "description": "Description" , + "save": "Save", + "title": "Title" +} diff --git a/public/locales/it/auth.json b/public/locales/it/auth.json new file mode 100644 index 0000000..c72fbc7 --- /dev/null +++ b/public/locales/it/auth.json @@ -0,0 +1,10 @@ +{ + "account_many": "account", + "account_one": "account", + "advanced_users": "Per utenti avanzati", + "change_apikey": "Cambia la chiave API", + "choose_custom_node": "Scegli un nodo custom", + "create_account": "crea un account", + "use_local_node": "Usa nodo locale", + "welcome": "Benvenuto in" +} diff --git a/public/locales/it/core.json b/public/locales/it/core.json new file mode 100644 index 0000000..d23032e --- /dev/null +++ b/public/locales/it/core.json @@ -0,0 +1,9 @@ +{ + "add": { + "task": "Aggiungi compito" + }, + "cancel": "Cancella", + "description": "Descrizione" , + "save": "Salva", + "title": "Titolo" +} diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index a892414..f1b8ece 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -30,6 +30,7 @@ import { cleanUrl, gateways } from '../background'; import { GlobalContext } from '../App'; import Tooltip, { TooltipProps, tooltipClasses } from '@mui/material/Tooltip'; import ThemeSelector from '../components/Theme/ThemeSelector'; +import { useTranslation } from 'react-i18next'; const manifestData = { version: '0.5.3', @@ -84,6 +85,7 @@ export const NotAuthenticated = ({ React.useState(null); const { showTutorial, hasSeenGettingStarted } = useContext(GlobalContext); const theme = useTheme(); + const { t } = useTranslation('auth'); const importedApiKeyRef = useRef(null); const currentNodeRef = useRef(null); @@ -183,6 +185,7 @@ export const NotAuthenticated = ({ useEffect(() => { importedApiKeyRef.current = importedApiKey; }, [importedApiKey]); + useEffect(() => { currentNodeRef.current = currentNode; }, [currentNode]); @@ -309,6 +312,7 @@ export const NotAuthenticated = ({ } else if (currentNodeRef.current) { payload = currentNodeRef.current; } + let isValid = false; const url = `${payload?.url}/admin/settings/localAuthBypassEnabled`; @@ -402,6 +406,7 @@ export const NotAuthenticated = ({ const addCustomNode = () => { setMode('add-node'); }; + const saveCustomNodes = (myNodes, isFullListOfNodes) => { let nodes = [...(myNodes || [])]; if (!isFullListOfNodes && customNodeToSaveIndex !== null) { @@ -455,7 +460,9 @@ export const NotAuthenticated = ({ > + + - WELCOME TO + {t('auth:welcome', { postProcess: 'capitalize' })} setExtstate('wallets')}> - {/* */} - Accounts + {t('auth:account_many', { postProcess: 'capitalize' })} - {/* - - */} @@ -565,10 +568,11 @@ export const NotAuthenticated = ({ }, }} > - Create account + {t('auth:create_account', { postProcess: 'capitalize' })} + {'Using node: '} {currentNode?.url} + <> - For advanced users + {t('auth:advanced_users', { postProcess: 'capitalize' })} From 3917aef45262fc4b88836be1663e823c3c528042 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 13:38:31 +0200 Subject: [PATCH 14/39] Add i18n files and set first translations --- README.md | 2 ++ docs/i18n_languages.md | 10 ++++++++++ i18n.js | 2 +- public/locales/en/auth.json | 9 ++++++--- public/locales/en/core.json | 12 +++++------- public/locales/it/auth.json | 13 ++++++++----- public/locales/it/core.json | 12 +++++------- src/ExtStates/NotAuthenticated.tsx | 13 ++++++++----- 8 files changed, 45 insertions(+), 28 deletions(-) create mode 100644 docs/i18n_languages.md diff --git a/README.md b/README.md index 4a62e6d..34cfbbb 100644 --- a/README.md +++ b/README.md @@ -23,3 +23,5 @@ Many additional details and a fully featured wiki will be created over time. Rea Qortal-Hub supports internationalization (i18n) using [i18next](https://www.i18next.com/), allowing seamless translation of UI text into multiple languages. The setup includes modularized translation files, language detection, context and runtime language switching. Files with translation are in `public/locales/` folder. + +See [guidelines](./docs/i18n_languages.md). diff --git a/docs/i18n_languages.md b/docs/i18n_languages.md new file mode 100644 index 0000000..7447193 --- /dev/null +++ b/docs/i18n_languages.md @@ -0,0 +1,10 @@ +# I18N Guidelines + +In JSON file: + +- Keep the file sorted +- Always write in lowercase + +In GUI: + +- If the first letter of the translation must be uppercase, use the postProcess, for example: `{t_auth('advanced_users', { postProcess: 'capitalize' })}` diff --git a/i18n.js b/i18n.js index 09886c5..6f21518 100644 --- a/i18n.js +++ b/i18n.js @@ -28,7 +28,7 @@ i18n debug: isDev, fallbackLng: 'en', ns: ['auth', 'core'], - supportedLngs: ['en', 'it', 'fr', 'es'], + supportedLngs: ['en', 'it'], backend: { backends: [LocalStorageBackend, HttpBackend], backendOptions: [ diff --git a/public/locales/en/auth.json b/public/locales/en/auth.json index 2c0bd67..d68032f 100644 --- a/public/locales/en/auth.json +++ b/public/locales/en/auth.json @@ -2,9 +2,12 @@ "account_many": "accounts", "account_one": "account", "advanced_users": "for advanced users", + "build_version": "build version", + "change_apikey": "change APIkey", + "choose_custom_node": "choose custom node", "create_account": "create account", - "welcome": "Welcome to", + "import_key": "import APIkey", "use_local_node": "use local node", - "change_apikey": "change API key", - "choose_custom_node": "choose custom node" + "using_node": "using node", + "welcome": "welcome to" } diff --git a/public/locales/en/core.json b/public/locales/en/core.json index d8f5ca1..042d80f 100644 --- a/public/locales/en/core.json +++ b/public/locales/en/core.json @@ -1,9 +1,7 @@ { - "add": { - "task": "Add task" - }, - "cancel": "Cancel", - "description": "Description" , - "save": "Save", - "title": "Title" + "cancel": "cancel", + "choose": "choose", + "description": "description", + "save": "save", + "title": "title" } diff --git a/public/locales/it/auth.json b/public/locales/it/auth.json index c72fbc7..fa99817 100644 --- a/public/locales/it/auth.json +++ b/public/locales/it/auth.json @@ -1,10 +1,13 @@ { "account_many": "account", "account_one": "account", - "advanced_users": "Per utenti avanzati", - "change_apikey": "Cambia la chiave API", - "choose_custom_node": "Scegli un nodo custom", + "advanced_users": "per utenti avanzati", + "build_version": "versione build", + "change_apikey": "cambia la chiave API", + "choose_custom_node": "scegli un nodo custom", "create_account": "crea un account", - "use_local_node": "Usa nodo locale", - "welcome": "Benvenuto in" + "import_key": "importa chiave API", + "use_local_node": "usa nodo locale", + "using_node": "nodo in uso", + "welcome": "benvenuto in" } diff --git a/public/locales/it/core.json b/public/locales/it/core.json index d23032e..2ee28d1 100644 --- a/public/locales/it/core.json +++ b/public/locales/it/core.json @@ -1,9 +1,7 @@ { - "add": { - "task": "Aggiungi compito" - }, - "cancel": "Cancella", - "description": "Descrizione" , - "save": "Salva", - "title": "Titolo" + "cancel": "cancella", + "choose": "scegli", + "description": "descrizione", + "save": "salva", + "title": "titolo" } diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index f1b8ece..b395a50 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -47,6 +47,7 @@ export const HtmlTooltip = styled(({ className, ...props }: TooltipProps) => ( fontSize: theme.typography.pxToRem(12), }, })); + function removeTrailingSlash(url) { return url.replace(/\/+$/, ''); } @@ -85,7 +86,7 @@ export const NotAuthenticated = ({ React.useState(null); const { showTutorial, hasSeenGettingStarted } = useContext(GlobalContext); const theme = useTheme(); - const { t } = useTranslation('auth'); + const { t } = useTranslation(['auth', 'core']); const importedApiKeyRef = useRef(null); const currentNodeRef = useRef(null); @@ -581,7 +582,8 @@ export const NotAuthenticated = ({ visibility: !useLocalNode && 'hidden', }} > - {'Using node: '} {currentNode?.url} + {t('auth:using_node', { postProcess: 'capitalize' })}:{' '} + {currentNode?.url} <> @@ -693,7 +695,7 @@ export const NotAuthenticated = ({ variant="contained" component="label" > - Choose custom node + {t('auth:choose_custom_node', { postProcess: 'capitalize' })} - Build version: {manifestData?.version} + {t('auth:build_version', { postProcess: 'capitalize' })}: + {manifestData?.version} @@ -788,7 +791,7 @@ export const NotAuthenticated = ({ }} variant="contained" > - Choose + {t('core:choose', { postProcess: 'capitalize' })} From 22845e8d410235f8d16e326b646e6477b6110a6a Mon Sep 17 00:00:00 2001 From: PhilReact Date: Mon, 21 Apr 2025 14:39:23 +0300 Subject: [PATCH 15/39] update readme --- README.md | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/README.md b/README.md index 25f4e90..001c6e9 100644 --- a/README.md +++ b/README.md @@ -19,3 +19,86 @@ Leveraging a redundant set of publicly accessible nodes provided by crowetic, Qo Many additional details and a fully featured wiki will be created over time. Reach out on the chat on https://qortal.dev or in any of the community locations for Qortal, if you have any issues. Thank you! +# 🤝 Contributing Guide + +Thank you for your interest in contributing! We follow a structured Git workflow to keep the project clean, stable, and production-ready at all times. + +--- + +## 📦 Branch Overview + +| Branch | Purpose | +|------------------|----------------------------------------------------------| +| `master` | Stable, production-ready code. All releases are tagged here. | +| `develop` | Active development branch. All new features go here first. | +| `release/x.y.z` | Pre-release branch for staging, QA, and final polish. | + +--- + +## 🌿 Creating a Feature or Fix + +1. **Start from `develop`:** + + ```bash + git checkout develop + git checkout -b feature/your-feature-name + ``` + +2. **Make your changes and commit them.** + +3. **Push your branch:** + + ```bash + git push origin feature/your-feature-name + ``` + +4. **Open a Pull Request into `develop`.** + +--- + +## 🚀 Releasing Code (Maintainers Only) + +A new `release/x.y.z` branch must be created for **every release**. + +1. **Create a `release/` branch from `master`:** + + ```bash + git checkout master + git checkout -b release/1.2.0 + ``` + +2. **Merge in `develop` or selected branches if `develop` is not ready:** + + ```bash + git merge develop + # or + git merge feature/finished-feature + git merge feature/another-complete-feature + ``` + +3. **Polish, test, and fix issues as needed.** + +4. **Merge back into `develop`:** + + ```bash + git checkout develop + git merge release/1.2.0 + git push origin develop + ``` + +5. **Finalize the release:** + + ```bash + git checkout master + git merge release/1.2.0 + git tag v1.2.0 + git push origin master --tags + ``` + +6. **Delete the release branch:** + + ```bash + git branch -d release/1.2.0 + git push origin --delete release/1.2.0 + ``` + From 4c01456565c5b7370ee03206f95dd0c0ad910208 Mon Sep 17 00:00:00 2001 From: PhilReact Date: Mon, 21 Apr 2025 14:56:59 +0300 Subject: [PATCH 16/39] moved readme --- README.md | 84 -------------------------------------------- docs/contribution.md | 84 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 84 deletions(-) create mode 100644 docs/contribution.md diff --git a/README.md b/README.md index 001c6e9..5ffbaf6 100644 --- a/README.md +++ b/README.md @@ -18,87 +18,3 @@ Leveraging a redundant set of publicly accessible nodes provided by crowetic, Qo Many additional details and a fully featured wiki will be created over time. Reach out on the chat on https://qortal.dev or in any of the community locations for Qortal, if you have any issues. Thank you! - -# 🤝 Contributing Guide - -Thank you for your interest in contributing! We follow a structured Git workflow to keep the project clean, stable, and production-ready at all times. - ---- - -## 📦 Branch Overview - -| Branch | Purpose | -|------------------|----------------------------------------------------------| -| `master` | Stable, production-ready code. All releases are tagged here. | -| `develop` | Active development branch. All new features go here first. | -| `release/x.y.z` | Pre-release branch for staging, QA, and final polish. | - ---- - -## 🌿 Creating a Feature or Fix - -1. **Start from `develop`:** - - ```bash - git checkout develop - git checkout -b feature/your-feature-name - ``` - -2. **Make your changes and commit them.** - -3. **Push your branch:** - - ```bash - git push origin feature/your-feature-name - ``` - -4. **Open a Pull Request into `develop`.** - ---- - -## 🚀 Releasing Code (Maintainers Only) - -A new `release/x.y.z` branch must be created for **every release**. - -1. **Create a `release/` branch from `master`:** - - ```bash - git checkout master - git checkout -b release/1.2.0 - ``` - -2. **Merge in `develop` or selected branches if `develop` is not ready:** - - ```bash - git merge develop - # or - git merge feature/finished-feature - git merge feature/another-complete-feature - ``` - -3. **Polish, test, and fix issues as needed.** - -4. **Merge back into `develop`:** - - ```bash - git checkout develop - git merge release/1.2.0 - git push origin develop - ``` - -5. **Finalize the release:** - - ```bash - git checkout master - git merge release/1.2.0 - git tag v1.2.0 - git push origin master --tags - ``` - -6. **Delete the release branch:** - - ```bash - git branch -d release/1.2.0 - git push origin --delete release/1.2.0 - ``` - diff --git a/docs/contribution.md b/docs/contribution.md new file mode 100644 index 0000000..b86ad3b --- /dev/null +++ b/docs/contribution.md @@ -0,0 +1,84 @@ + +# 🤝 Contributing Guide + +Thank you for your interest in contributing! We follow a structured Git workflow to keep the project clean, stable, and production-ready at all times. + +--- + +## 📦 Branch Overview + +| Branch | Purpose | +|------------------|----------------------------------------------------------| +| `master` | Stable, production-ready code. All releases are tagged here. | +| `develop` | Active development branch. All new features go here first. | +| `release/x.y.z` | Pre-release branch for staging, QA, and final polish. | + +--- + +## 🌿 Creating a Feature or Fix + +1. **Start from `develop`:** + + ```bash + git checkout develop + git checkout -b feature/your-feature-name + ``` + +2. **Make your changes and commit them.** + +3. **Push your branch:** + + ```bash + git push origin feature/your-feature-name + ``` + +4. **Open a Pull Request into `develop`.** + +--- + +## 🚀 Releasing Code (Maintainers Only) + +A new `release/x.y.z` branch must be created for **every release**. + +1. **Create a `release/` branch from `master`:** + + ```bash + git checkout master + git checkout -b release/1.2.0 + ``` + +2. **Merge in `develop` or selected branches if `develop` is not ready:** + + ```bash + git merge develop + # or + git merge feature/finished-feature + git merge feature/another-complete-feature + ``` + +3. **Polish, test, and fix issues as needed.** + +4. **Merge back into `develop`:** + + ```bash + git checkout develop + git merge release/1.2.0 + git push origin develop + ``` + +5. **Finalize the release:** + + ```bash + git checkout master + git merge release/1.2.0 + git tag v1.2.0 + git push origin master --tags + ``` + +6. **Delete the release branch:** + + ```bash + git branch -d release/1.2.0 + git push origin --delete release/1.2.0 + ``` + From 8140eb7058081ee173ec2ebdcbc1aa9faddd966e Mon Sep 17 00:00:00 2001 From: Phillip <48392931+Philreact@users.noreply.github.com> Date: Mon, 21 Apr 2025 14:59:06 +0300 Subject: [PATCH 17/39] Update docs/contribution.md Co-authored-by: nico.benaz <52411515+nbenaglia@users.noreply.github.com> --- docs/contribution.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contribution.md b/docs/contribution.md index b86ad3b..07d06fe 100644 --- a/docs/contribution.md +++ b/docs/contribution.md @@ -9,7 +9,7 @@ Thank you for your interest in contributing! We follow a structured Git workflow | Branch | Purpose | |------------------|----------------------------------------------------------| -| `master` | Stable, production-ready code. All releases are tagged here. | +| `master` | Stable, production-ready code. All releases are tagged from here. | | `develop` | Active development branch. All new features go here first. | | `release/x.y.z` | Pre-release branch for staging, QA, and final polish. | From 01b76c981732d5f0929bb298700b18b8ac25052a Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 14:47:23 +0200 Subject: [PATCH 18/39] Add translations --- public/locales/en/auth.json | 21 +++++-- public/locales/en/core.json | 4 ++ public/locales/it/auth.json | 21 +++++-- public/locales/it/core.json | 4 ++ src/ExtStates/NotAuthenticated.tsx | 90 ++++++++++++++++++++---------- 5 files changed, 99 insertions(+), 41 deletions(-) diff --git a/public/locales/en/auth.json b/public/locales/en/auth.json index d68032f..02c348d 100644 --- a/public/locales/en/auth.json +++ b/public/locales/en/auth.json @@ -2,12 +2,23 @@ "account_many": "accounts", "account_one": "account", "advanced_users": "for advanced users", + "apikey": { + "alternative": "alternative: File select", + "change": "change APIkey", + "enter": "enter APIkey", + "import": "import APIkey", + "key": "API key", + "select_valid": "select a valid apikey" + }, "build_version": "build version", - "change_apikey": "change APIkey", - "choose_custom_node": "choose custom node", "create_account": "create account", - "import_key": "import APIkey", - "use_local_node": "use local node", - "using_node": "using node", + "return_to_list": "return to list", + "node": { + "choose": "choose custom node", + "custom_many": "custom nodes", + "use_custom": "use custom node", + "use_local": "use local node", + "using": "using node" + }, "welcome": "welcome to" } diff --git a/public/locales/en/core.json b/public/locales/en/core.json index 042d80f..bfc8b94 100644 --- a/public/locales/en/core.json +++ b/public/locales/en/core.json @@ -1,7 +1,11 @@ { + "add": "add", "cancel": "cancel", "choose": "choose", + "close": "close", "description": "description", + "edit": "edit", + "error": "an error occurred", "save": "save", "title": "title" } diff --git a/public/locales/it/auth.json b/public/locales/it/auth.json index fa99817..306bd0f 100644 --- a/public/locales/it/auth.json +++ b/public/locales/it/auth.json @@ -2,12 +2,23 @@ "account_many": "account", "account_one": "account", "advanced_users": "per utenti avanzati", + "apikey": { + "alternative": "alternativa: seleziona un file", + "change": "cambia la chiave API", + "enter": "inserisci la chiave API", + "import": "importa chiave API", + "key": "chiave API", + "select_valid": "selezione una chiave API valida" + }, + "node": { + "choose": "scegli un nodo custom", + "custom_many": "nodi custom", + "use_custom": "use nodo custom", + "use_local": "usa nodo locale", + "using": "nodo in uso" + }, "build_version": "versione build", - "change_apikey": "cambia la chiave API", - "choose_custom_node": "scegli un nodo custom", "create_account": "crea un account", - "import_key": "importa chiave API", - "use_local_node": "usa nodo locale", - "using_node": "nodo in uso", + "return_to_list": "ritorna alla lista", "welcome": "benvenuto in" } diff --git a/public/locales/it/core.json b/public/locales/it/core.json index 2ee28d1..3bbac5b 100644 --- a/public/locales/it/core.json +++ b/public/locales/it/core.json @@ -1,7 +1,11 @@ { + "add": "aggiungi", "cancel": "cancella", "choose": "scegli", + "close": "chiudi", "description": "descrizione", + "edit": "modifica", + "error": "si è verificato un errore", "save": "salva", "title": "titolo" } diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index b395a50..44886e7 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -40,8 +40,8 @@ export const HtmlTooltip = styled(({ className, ...props }: TooltipProps) => ( ))(({ theme }) => ({ [`& .${tooltipClasses.tooltip}`]: { - backgroundColor: '#232428', - color: 'white', + backgroundColor: theme.palette.background.paper, + color: theme.palette.text.primary, maxWidth: 320, padding: '20px', fontSize: theme.typography.pxToRem(12), @@ -350,7 +350,7 @@ export const NotAuthenticated = ({ .catch((error) => { console.error( 'Failed to set API key:', - error.message || 'An error occurred' + error.message || t('core:error', { postProcess: 'capitalize' }) ); }); } else { @@ -359,7 +359,9 @@ export const NotAuthenticated = ({ if (!fromStartUp) { setInfoSnack({ type: 'error', - message: 'Select a valid apikey', + message: t('auth:apikey.select_valid', { + postProcess: 'capitalize', + }), }); setOpenSnack(true); } @@ -382,7 +384,10 @@ export const NotAuthenticated = ({ .catch((error) => { console.error( 'Failed to set API key:', - error.message || 'An error occurred' + error.message || + t('core:error', { + postProcess: 'capitalize', + }) ); }); return; @@ -390,7 +395,11 @@ export const NotAuthenticated = ({ if (!fromStartUp) { setInfoSnack({ type: 'error', - message: error?.message || 'Select a valid apikey', + message: + error?.message || + t('auth:apikey.select_valid', { + postProcess: 'capitalize', + }), }); setOpenSnack(true); } @@ -507,7 +516,8 @@ export const NotAuthenticated = ({ transaction you make is linked to your ID, and this is where you manage all your QORT and other tradeable cryptocurrencies on Qortal. - + {' '} + // TODO translate } > @@ -538,7 +548,8 @@ export const NotAuthenticated = ({ }} > New users start here! - + {' '} + // TODO translate + {' '} + // TODO translate } > @@ -582,7 +594,7 @@ export const NotAuthenticated = ({ visibility: !useLocalNode && 'hidden', }} > - {t('auth:using_node', { postProcess: 'capitalize' })}:{' '} + {t('auth:node.using', { postProcess: 'capitalize' })}:{' '} {currentNode?.url} @@ -635,7 +647,7 @@ export const NotAuthenticated = ({ }, '& .MuiSwitch-switchBase.Mui-checked + .MuiSwitch-track': { - backgroundColor: 'white', // Change track color when checked + backgroundColor: theme.palette.background.default, }, }} checked={useLocalNode} @@ -666,7 +678,11 @@ export const NotAuthenticated = ({ disabled={false} /> } - label={`Use ${isLocal ? 'Local' : 'Custom'} Node`} + label={ + isLocal + ? t('auth:node.use_local', { postProcess: 'capitalize' }) + : t('auth:node.use_custom', { postProcess: 'capitalize' }) + } /> {currentNode?.url === 'http://127.0.0.1:12391' && ( @@ -677,14 +693,19 @@ export const NotAuthenticated = ({ variant="contained" component="label" > - {apiKey ? 'Change ' : 'Import '} apikey + {apiKey + ? t('auth:node.use_local', { postProcess: 'capitalize' }) + : t('auth:apikey.import', { postProcess: 'capitalize' })} {`api key : ${importedApiKey}`} + > + {t('auth:apikey.key', { postProcess: 'capitalize' })}: $ + {importedApiKey} + )} @@ -709,6 +730,7 @@ export const NotAuthenticated = ({ + - {'Custom nodes'} + + {' '} + {t('auth:node.custom_many', { postProcess: 'capitalize' })}: + @@ -807,7 +832,7 @@ export const NotAuthenticated = ({ > @@ -850,8 +875,9 @@ export const NotAuthenticated = ({ }} variant="contained" > - Choose + {t('core:choose', { postProcess: 'capitalize' })} + + @@ -920,13 +946,13 @@ export const NotAuthenticated = ({ }} autoFocus > - Close + {t('core:close', { postProcess: 'capitalize' })} )} {mode === 'list' && ( )} @@ -939,7 +965,7 @@ export const NotAuthenticated = ({ setCustomNodeToSaveIndex(null); }} > - Return to list + {t('auth:return_to_list', { postProcess: 'capitalize' })} )} @@ -962,7 +988,9 @@ export const NotAuthenticated = ({ aria-labelledby="alert-dialog-title" aria-describedby="alert-dialog-description" > - {'Enter apikey'} + + {t('auth:enter_apikey', { postProcess: 'capitalize' })} + - Alternative: File select + {t('auth:apikey_alternative', { postProcess: 'capitalize' })} - Close + {t('core:close', { postProcess: 'capitalize' })} From 653532e78ed6060b3bba4d698e13f47fa86ac29f Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 20:02:06 +0200 Subject: [PATCH 19/39] i18n for tutorial --- i18n.js | 2 +- public/locales/en/tutorial.json | 12 +++++++++ src/components/Tutorials/Tutorials.tsx | 10 +++---- .../Tutorials/useHandleTutorials.tsx | 27 ++++++++++++++----- 4 files changed, 39 insertions(+), 12 deletions(-) create mode 100644 public/locales/en/tutorial.json diff --git a/i18n.js b/i18n.js index 6f21518..e785beb 100644 --- a/i18n.js +++ b/i18n.js @@ -27,7 +27,7 @@ i18n .init({ debug: isDev, fallbackLng: 'en', - ns: ['auth', 'core'], + ns: ['auth', 'core', 'tutorial'], supportedLngs: ['en', 'it'], backend: { backends: [LocalStorageBackend, HttpBackend], diff --git a/public/locales/en/tutorial.json b/public/locales/en/tutorial.json new file mode 100644 index 0000000..8aeab89 --- /dev/null +++ b/public/locales/en/tutorial.json @@ -0,0 +1,12 @@ +{ + "1_getting_started": "1. Getting Started", + "2_overview": "2. Overview", + "3_groups": "3. Qortal Groups", + "4_obtain_qort": "4. Obtaining Qort", + "account_creation": "Account Creation", + "important_info": "Important Information!", + "apps": { + "dashboard": "1. Apps Dashboard", + "navigation": "2. Apps Navigation" + } +} diff --git a/src/components/Tutorials/Tutorials.tsx b/src/components/Tutorials/Tutorials.tsx index 382774c..06274e7 100644 --- a/src/components/Tutorials/Tutorials.tsx +++ b/src/components/Tutorials/Tutorials.tsx @@ -13,11 +13,13 @@ import { } from '@mui/material'; import CloseIcon from '@mui/icons-material/Close'; import { VideoPlayer } from '../Embeds/VideoPlayer'; +import { useTranslation } from 'react-i18next'; export const Tutorials = () => { const { openTutorialModal, setOpenTutorialModal } = useContext(GlobalContext); const [multiNumber, setMultiNumber] = useState(0); const theme = useTheme(); + const { t } = useTranslation(['core', 'tutorial']); const handleClose = () => { setOpenTutorialModal(null); @@ -61,9 +63,7 @@ export const Tutorials = () => { })} - - {selectedTutorial?.title} {` Tutorial`} - + {selectedTutorial?.title} { @@ -138,7 +138,7 @@ export const Tutorials = () => { diff --git a/src/components/Tutorials/useHandleTutorials.tsx b/src/components/Tutorials/useHandleTutorials.tsx index 1df8626..3569beb 100644 --- a/src/components/Tutorials/useHandleTutorials.tsx +++ b/src/components/Tutorials/useHandleTutorials.tsx @@ -8,6 +8,7 @@ import navigationImg from './img/navigation.webp'; import overviewImg from './img/overview.webp'; import startedImg from './img/started.webp'; import obtainingImg from './img/obtaining-qort.jpg'; +import { useTranslation } from 'react-i18next'; const checkIfGatewayIsOnline = async () => { try { @@ -27,9 +28,11 @@ const checkIfGatewayIsOnline = async () => { return false; } }; + export const useHandleTutorials = () => { const [openTutorialModal, setOpenTutorialModal] = useState(null); const [shownTutorials, setShowTutorials] = useState(null); + const { t } = useTranslation(['core', 'tutorial']); useEffect(() => { try { @@ -104,7 +107,9 @@ export const useHandleTutorials = () => { setOpenTutorialModal({ multi: [ { - title: '1. Getting Started', + title: t('tutorial:1_getting_started', { + postProcess: 'capitalize', + }), resource: { name: 'a-test', service: 'VIDEO', @@ -113,7 +118,9 @@ export const useHandleTutorials = () => { }, }, { - title: '2. Overview', + title: t('tutorial:2_overview', { + postProcess: 'capitalize', + }), resource: { name: 'a-test', service: 'VIDEO', @@ -122,7 +129,9 @@ export const useHandleTutorials = () => { }, }, { - title: '3. Qortal Groups', + title: t('tutorial:3_groups', { + postProcess: 'capitalize', + }), resource: { name: 'a-test', service: 'VIDEO', @@ -131,7 +140,9 @@ export const useHandleTutorials = () => { }, }, { - title: '4. Obtaining Qort', + title: t('tutorial:4_obtain_qort', { + postProcess: 'capitalize', + }), resource: { name: 'a-test', service: 'VIDEO', @@ -151,7 +162,9 @@ export const useHandleTutorials = () => { setOpenTutorialModal({ multi: [ { - title: '1. Apps Dashboard', + title: t('tutorial:app.dashboard', { + postProcess: 'capitalize', + }), resource: { name: 'a-test', service: 'VIDEO', @@ -160,7 +173,9 @@ export const useHandleTutorials = () => { }, }, { - title: '2. Apps Navigation', + title: t('tutorial:app.navigation', { + postProcess: 'capitalize', + }), resource: { name: 'a-test', service: 'VIDEO', From 3bc139041df99e23283adfb1eabc3039f290e778 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 20:06:57 +0200 Subject: [PATCH 20/39] Fix style for login buttons --- src/styles/App-styles.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/styles/App-styles.ts b/src/styles/App-styles.ts index 9b385bc..980657b 100644 --- a/src/styles/App-styles.ts +++ b/src/styles/App-styles.ts @@ -130,10 +130,10 @@ export const CustomButton = styled(Box)(({ theme }) => ({ transition: 'all 0.2s', width: 'fit-content', '&:hover': { - backgroundColor: theme.palette.background.default, - color: '#fff', + backgroundColor: theme.palette.background.paper, + color: theme.palette.text.secondary, 'svg path': { - fill: '#fff', + fill: theme.palette.background.paper, }, }, })); From af48dd7c063f0c8930f474712ce534d9f80e9481 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 20:12:49 +0200 Subject: [PATCH 21/39] Change close button position (now right) --- src/ExtStates/NotAuthenticated.tsx | 37 ++++++++++++++++-------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/ExtStates/NotAuthenticated.tsx b/src/ExtStates/NotAuthenticated.tsx index 44886e7..74b7798 100644 --- a/src/ExtStates/NotAuthenticated.tsx +++ b/src/ExtStates/NotAuthenticated.tsx @@ -936,7 +936,14 @@ export const NotAuthenticated = ({ )} + + {mode === 'list' && ( + + )} + {mode === 'list' && ( <> - )} {mode === 'add-node' && ( <> @@ -989,7 +991,7 @@ export const NotAuthenticated = ({ aria-describedby="alert-dialog-description" > - {t('auth:enter_apikey', { postProcess: 'capitalize' })} + {t('auth:apikey.enter', { postProcess: 'capitalize' })} - {t('auth:apikey_alternative', { postProcess: 'capitalize' })} + {t('auth:apikey.alternative', { postProcess: 'capitalize' })} - - + + + )} From c75b3de1cb9d9de8953c3b06e03ce1309bd7b6c3 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 20:29:48 +0200 Subject: [PATCH 22/39] i18n for thingsToDoInitial --- public/locales/en/tutorial.json | 9 ++++++-- public/locales/it/core.json | 1 + src/components/Group/ThingsToDoInitial.tsx | 25 ++++++++++++++++------ 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/public/locales/en/tutorial.json b/public/locales/en/tutorial.json index 8aeab89..2b632b3 100644 --- a/public/locales/en/tutorial.json +++ b/public/locales/en/tutorial.json @@ -3,10 +3,15 @@ "2_overview": "2. Overview", "3_groups": "3. Qortal Groups", "4_obtain_qort": "4. Obtaining Qort", - "account_creation": "Account Creation", - "important_info": "Important Information!", + "account_creation": "account creation", + "important_info": "important information!", "apps": { "dashboard": "1. Apps Dashboard", "navigation": "2. Apps Navigation" + }, + "initial": { + "6_qort": "Have at least 6 QORT in your wallet", + "getting_started": "getting started", + "register_name": "register a name" } } diff --git a/public/locales/it/core.json b/public/locales/it/core.json index 3bbac5b..673062f 100644 --- a/public/locales/it/core.json +++ b/public/locales/it/core.json @@ -6,6 +6,7 @@ "description": "descrizione", "edit": "modifica", "error": "si è verificato un errore", + "loading": "loading...", "save": "salva", "title": "titolo" } diff --git a/src/components/Group/ThingsToDoInitial.tsx b/src/components/Group/ThingsToDoInitial.tsx index 023cfde..6c315cd 100644 --- a/src/components/Group/ThingsToDoInitial.tsx +++ b/src/components/Group/ThingsToDoInitial.tsx @@ -4,10 +4,11 @@ import ListItem from '@mui/material/ListItem'; import ListItemButton from '@mui/material/ListItemButton'; import ListItemIcon from '@mui/material/ListItemIcon'; import ListItemText from '@mui/material/ListItemText'; -import { Box, Typography } from '@mui/material'; +import { Box, Typography, useTheme } from '@mui/material'; import { Spacer } from '../../common/Spacer'; import { QMailMessages } from './QMailMessages'; import { executeEvent } from '../../utils/events'; +import { useTranslation } from 'react-i18next'; export const ThingsToDoInitial = ({ myAddress, @@ -18,6 +19,8 @@ export const ThingsToDoInitial = ({ }) => { const [checked1, setChecked1] = React.useState(false); const [checked2, setChecked2] = React.useState(false); + const { t } = useTranslation(['core', 'tutorial']); + const theme = useTheme(); React.useEffect(() => { if (balance && +balance >= 6) { @@ -72,7 +75,11 @@ export const ThingsToDoInitial = ({ fontWeight: 600, }} > - {!isLoaded ? 'Loading...' : 'Getting Started'} + {!isLoaded + ? t('core:loading', { postProcess: 'capitalize' }) + : t('tutorial:initial.getting_started', { + postProcess: 'capitalize', + })} @@ -80,12 +87,12 @@ export const ThingsToDoInitial = ({ {isLoaded && ( @@ -114,7 +121,9 @@ export const ThingsToDoInitial = ({ fontWeight: 400, }, }} - primary={`Have at least 6 QORT in your wallet`} + primary={t('tutorial:initial.6_qort', { + postProcess: 'capitalize', + })} /> Date: Mon, 21 Apr 2025 20:30:58 +0200 Subject: [PATCH 23/39] Remove unused file --- src/components/Group/Home.tsx | 112 ---------------------------------- 1 file changed, 112 deletions(-) delete mode 100644 src/components/Group/Home.tsx diff --git a/src/components/Group/Home.tsx b/src/components/Group/Home.tsx deleted file mode 100644 index a8c804c..0000000 --- a/src/components/Group/Home.tsx +++ /dev/null @@ -1,112 +0,0 @@ -import { Box, Button, Typography } from "@mui/material"; -import React from "react"; -import { Spacer } from "../../common/Spacer"; -import { ListOfThreadPostsWatched } from "./ListOfThreadPostsWatched"; -import { ThingsToDoInitial } from "./ThingsToDoInitial"; -import { GroupJoinRequests } from "./GroupJoinRequests"; -import { GroupInvites } from "./GroupInvites"; -import RefreshIcon from "@mui/icons-material/Refresh"; - -export const Home = ({ - refreshHomeDataFunc, - myAddress, - isLoadingGroups, - balance, - userInfo, - groups, - setGroupSection, - setSelectedGroup, - getTimestampEnterChat, - setOpenManageMembers, - setOpenAddGroup, - setMobileViewMode, - setDesktopViewMode -}) => { - return ( - - - 15 ? "16px" : "20px", - padding: '10px' - }} - > - Welcome - {userInfo?.name ? ( - {`, ${userInfo?.name}`} - ) : null} - - - - {/* - - */} - {!isLoadingGroups && ( - - - - - - - - )} - - - ); -}; From 59573a43abc0d32169d83515bef04223f3d263bf Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 21:02:10 +0200 Subject: [PATCH 24/39] i18n for welcome page --- public/locales/en/core.json | 8 +- public/locales/en/tutorial.json | 6 +- public/locales/it/core.json | 3 +- src/components/Explore/Explore.tsx | 121 +++++------ src/components/Group/HomeDesktop.tsx | 306 +++++++++++++-------------- src/components/Home/QortPrice.tsx | 142 ++++++------- 6 files changed, 299 insertions(+), 287 deletions(-) diff --git a/public/locales/en/core.json b/public/locales/en/core.json index bfc8b94..b9ea602 100644 --- a/public/locales/en/core.json +++ b/public/locales/en/core.json @@ -6,6 +6,12 @@ "description": "description", "edit": "edit", "error": "an error occurred", + "last_height": "last height", + "price": "price", "save": "save", - "title": "title" + "supply": "supply", + "title": "title", + "wallet": "wallet", + "wallet_many": "wallets", + "welcome": "welcome" } diff --git a/public/locales/en/tutorial.json b/public/locales/en/tutorial.json index 2b632b3..f022388 100644 --- a/public/locales/en/tutorial.json +++ b/public/locales/en/tutorial.json @@ -11,7 +11,11 @@ }, "initial": { "6_qort": "Have at least 6 QORT in your wallet", + "explore": "explore", + "general_chat": "general chat", "getting_started": "getting started", - "register_name": "register a name" + "register_name": "register a name", + "see_apps": "see apps", + "trade_qort": "trade QORT" } } diff --git a/public/locales/it/core.json b/public/locales/it/core.json index 673062f..db7e120 100644 --- a/public/locales/it/core.json +++ b/public/locales/it/core.json @@ -6,7 +6,8 @@ "description": "descrizione", "edit": "modifica", "error": "si è verificato un errore", - "loading": "loading...", + "loading": "caricamento...", "save": "salva", + "supply": "offerta", "title": "titolo" } diff --git a/src/components/Explore/Explore.tsx b/src/components/Explore/Explore.tsx index 61037d7..4ec6488 100644 --- a/src/components/Explore/Explore.tsx +++ b/src/components/Explore/Explore.tsx @@ -1,129 +1,130 @@ -import { Box, ButtonBase, Typography } from "@mui/material"; -import React from "react"; -import ChatIcon from "@mui/icons-material/Chat"; -import qTradeLogo from "../../assets/Icons/q-trade-logo.webp"; -import AppsIcon from "@mui/icons-material/Apps"; -import { executeEvent } from "../../utils/events"; +import { Box, ButtonBase, Typography, useTheme } from '@mui/material'; +import ChatIcon from '@mui/icons-material/Chat'; +import qTradeLogo from '../../assets/Icons/q-trade-logo.webp'; +import AppsIcon from '@mui/icons-material/Apps'; +import { executeEvent } from '../../utils/events'; import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet'; +import { useTranslation } from 'react-i18next'; +export const Explore = ({ setDesktopViewMode }) => { + const theme = useTheme(); + const { t } = useTranslation(['core', 'tutorial']); -export const Explore = ({setDesktopViewMode}) => { return ( { - executeEvent("addTab", { - data: { service: "APP", name: "q-trade" }, - }); - executeEvent("open-apps-mode", {}); - }} + executeEvent('addTab', { + data: { service: 'APP', name: 'q-trade' }, + }); + executeEvent('open-apps-mode', {}); + }} > - Trade QORT + {t('tutorial:initial.trade_qort', { postProcess: 'capitalize' })} + { + setDesktopViewMode('apps'); }} - onClick={()=> { - setDesktopViewMode('apps') - - }} > - See Apps + {t('tutorial:initial.see_apps', { postProcess: 'capitalize' })} + { - executeEvent("openGroupMessage", { - from: "0" , - }); - }} + executeEvent('openGroupMessage', { + from: '0', + }); + }} > - General Chat + {t('tutorial:initial.general_chat', { postProcess: 'capitalize' })} { - executeEvent("openWalletsApp", { - - }); - }} + executeEvent('openWalletsApp', {}); + }} > - Wallets + {t('core:wallet', { count: 100, postProcess: 'capitalize' })} diff --git a/src/components/Group/HomeDesktop.tsx b/src/components/Group/HomeDesktop.tsx index d83f774..0c6ca85 100644 --- a/src/components/Group/HomeDesktop.tsx +++ b/src/components/Group/HomeDesktop.tsx @@ -1,16 +1,16 @@ -import { Box, Button, Divider, Typography } from "@mui/material"; -import React from "react"; -import { Spacer } from "../../common/Spacer"; -import { ListOfThreadPostsWatched } from "./ListOfThreadPostsWatched"; -import { ThingsToDoInitial } from "./ThingsToDoInitial"; -import { GroupJoinRequests } from "./GroupJoinRequests"; -import { GroupInvites } from "./GroupInvites"; -import RefreshIcon from "@mui/icons-material/Refresh"; -import { ListOfGroupPromotions } from "./ListOfGroupPromotions"; -import { QortPrice } from "../Home/QortPrice"; -import ExploreIcon from "@mui/icons-material/Explore"; -import { Explore } from "../Explore/Explore"; -import { NewUsersCTA } from "../Home/NewUsersCTA"; +import { Box, Divider, Typography, useTheme } from '@mui/material'; +import React from 'react'; +import { Spacer } from '../../common/Spacer'; +import { ThingsToDoInitial } from './ThingsToDoInitial'; +import { GroupJoinRequests } from './GroupJoinRequests'; +import { GroupInvites } from './GroupInvites'; +import { ListOfGroupPromotions } from './ListOfGroupPromotions'; +import { QortPrice } from '../Home/QortPrice'; +import ExploreIcon from '@mui/icons-material/Explore'; +import { Explore } from '../Explore/Explore'; +import { NewUsersCTA } from '../Home/NewUsersCTA'; +import { useTranslation } from 'react-i18next'; + export const HomeDesktop = ({ refreshHomeDataFunc, myAddress, @@ -30,93 +30,97 @@ export const HomeDesktop = ({ }) => { const [checked1, setChecked1] = React.useState(false); const [checked2, setChecked2] = React.useState(false); - React.useEffect(() => { - if (balance && +balance >= 6) { - setChecked1(true); - } - }, [balance]); - - - React.useEffect(() => { - if (name) setChecked2(true); - }, [name]); - - - const isLoaded = React.useMemo(()=> { - if(userInfo !== null) return true - return false - }, [ userInfo]) - - const hasDoneNameAndBalanceAndIsLoaded = React.useMemo(()=> { - if(isLoaded && checked1 && checked2) return true - return false - }, [checked1, isLoaded, checked2]) - + const { t } = useTranslation(['core']); + const theme = useTheme(); + + React.useEffect(() => { + if (balance && +balance >= 6) { + setChecked1(true); + } + }, [balance]); + + React.useEffect(() => { + if (name) setChecked2(true); + }, [name]); + + const isLoaded = React.useMemo(() => { + if (userInfo !== null) return true; + return false; + }, [userInfo]); + + const hasDoneNameAndBalanceAndIsLoaded = React.useMemo(() => { + if (isLoaded && checked1 && checked2) return true; + return false; + }, [checked1, isLoaded, checked2]); + return ( + 15 ? "16px" : "20px", - padding: "10px", + fontSize: userInfo?.name?.length > 15 ? '16px' : '20px', + padding: '10px', }} > - Welcome + {t('core:welcome', { postProcess: 'capitalize' })} {userInfo?.name ? ( {`, ${userInfo?.name}`} ) : null} + + {!isLoadingGroups && ( item?.groupId !== "0").length !== 0 + groups?.filter((item) => item?.groupId !== '0').length !== 0 } /> - - {desktopViewMode === "home" && ( + + {desktopViewMode === 'home' && ( <> {/* */} - {hasDoneNameAndBalanceAndIsLoaded && ( - <> - - - - - - - - )} - + {hasDoneNameAndBalanceAndIsLoaded && ( + <> + + + + + + + + + )} )} )} - + {!isLoadingGroups && ( <> - - - {" "} - - Explore - {" "} - - - {!hasDoneNameAndBalanceAndIsLoaded && ( - - )} - - {hasDoneNameAndBalanceAndIsLoaded && ( - + + {' '} + + {t('tutorial:initial.explore', { postProcess: 'capitalize' })} + {' '} + + - )} - - - - - + {!hasDoneNameAndBalanceAndIsLoaded && } + + {hasDoneNameAndBalanceAndIsLoaded && } + + + + + - )} diff --git a/src/components/Home/QortPrice.tsx b/src/components/Home/QortPrice.tsx index f4586fb..2f118c1 100644 --- a/src/components/Home/QortPrice.tsx +++ b/src/components/Home/QortPrice.tsx @@ -1,8 +1,9 @@ -import React, { useCallback, useEffect, useState } from "react"; -import { getBaseApiReact } from "../../App"; -import { Box, Tooltip, Typography } from "@mui/material"; -import { BarSpinner } from "../../common/Spinners/BarSpinner/BarSpinner"; -import { formatDate } from "../../utils/time"; +import { useCallback, useEffect, useState } from 'react'; +import { getBaseApiReact } from '../../App'; +import { Box, Tooltip, Typography, useTheme } from '@mui/material'; +import { BarSpinner } from '../../common/Spinners/BarSpinner/BarSpinner'; +import { formatDate } from '../../utils/time'; +import { useTranslation } from 'react-i18next'; function getAverageLtcPerQort(trades) { let totalQort = 0; @@ -38,6 +39,8 @@ export const QortPrice = () => { const [supply, setSupply] = useState(null); const [lastBlock, setLastBlock] = useState(null); const [loading, setLoading] = useState(true); + const { t } = useTranslation(['core', 'tutorial']); + const theme = useTheme(); const getPrice = useCallback(async () => { try { @@ -101,64 +104,63 @@ export const QortPrice = () => { return () => clearInterval(interval); }, [getPrice]); - return ( + Based on the latest 20 trades } placement="bottom" arrow - sx={{ fontSize: "24" }} + sx={{ fontSize: '24' }} slotProps={{ tooltip: { sx: { - color: "#ffffff", - backgroundColor: "#444444", + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.default, }, }, arrow: { sx: { - color: "#444444", + color: theme.palette.text.primary, }, }, }} > - Price + {t('core:price', { postProcess: 'capitalize' })} + {!ltcPerQort ? ( ) : ( {ltcPerQort} LTC/QORT @@ -168,28 +170,28 @@ export const QortPrice = () => { - Supply + {t('core:supply', { postProcess: 'capitalize' })} + {!supply ? ( ) : ( {supply} QORT @@ -197,60 +199,58 @@ export const QortPrice = () => { )} - {lastBlock?.timestamp && formatDate(lastBlock?.timestamp)} - - } - placement="bottom" - arrow - sx={{ fontSize: "24" }} - slotProps={{ - tooltip: { - sx: { - color: "#ffffff", - backgroundColor: "#444444", - }, + title={ + + {lastBlock?.timestamp && formatDate(lastBlock?.timestamp)} + + } + placement="bottom" + arrow + sx={{ fontSize: '24' }} + slotProps={{ + tooltip: { + sx: { + color: theme.palette.text.primary, + backgroundColor: theme.palette.background.default, }, - arrow: { - sx: { - color: "#444444", - }, + }, + arrow: { + sx: { + color: theme.palette.text.primary, }, - }} - > - - + - Last height + {t('core:last_height', { postProcess: 'capitalize' })} + {!lastBlock?.height ? ( ) : ( {lastBlock?.height} )} - - + ); From aace10c85302698b1015156fed88ee3fae824772 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 21:18:50 +0200 Subject: [PATCH 25/39] Set plural key --- public/locales/en/core.json | 3 ++- public/locales/it/core.json | 7 ++++++- src/components/Explore/Explore.tsx | 2 +- src/components/Group/HomeDesktop.tsx | 1 + src/components/Tutorials/useHandleTutorials.tsx | 4 ++-- 5 files changed, 12 insertions(+), 5 deletions(-) diff --git a/public/locales/en/core.json b/public/locales/en/core.json index b9ea602..0674642 100644 --- a/public/locales/en/core.json +++ b/public/locales/en/core.json @@ -7,11 +7,12 @@ "edit": "edit", "error": "an error occurred", "last_height": "last height", + "loading": "loading...", "price": "price", "save": "save", "supply": "supply", "title": "title", "wallet": "wallet", - "wallet_many": "wallets", + "wallet_other": "wallets", "welcome": "welcome" } diff --git a/public/locales/it/core.json b/public/locales/it/core.json index db7e120..6376e0a 100644 --- a/public/locales/it/core.json +++ b/public/locales/it/core.json @@ -6,8 +6,13 @@ "description": "descrizione", "edit": "modifica", "error": "si è verificato un errore", + "last_height": "ultimo blocco", "loading": "caricamento...", + "price": "prezzo", "save": "salva", "supply": "offerta", - "title": "titolo" + "title": "titolo", + "wallet": "wallet", + "wallet_other": "wallet", + "welcome": "benvenuto" } diff --git a/src/components/Explore/Explore.tsx b/src/components/Explore/Explore.tsx index 4ec6488..ae1988e 100644 --- a/src/components/Explore/Explore.tsx +++ b/src/components/Explore/Explore.tsx @@ -124,7 +124,7 @@ export const Explore = ({ setDesktopViewMode }) => { fontSize: '1rem', }} > - {t('core:wallet', { count: 100, postProcess: 'capitalize' })} + {t('core:wallet_other', { postProcess: 'capitalize' })} diff --git a/src/components/Group/HomeDesktop.tsx b/src/components/Group/HomeDesktop.tsx index 0c6ca85..d0f2459 100644 --- a/src/components/Group/HomeDesktop.tsx +++ b/src/components/Group/HomeDesktop.tsx @@ -241,6 +241,7 @@ export const HomeDesktop = ({ )} + {/* { setOpenTutorialModal({ multi: [ { - title: t('tutorial:app.dashboard', { + title: t('tutorial:apps.dashboard', { postProcess: 'capitalize', }), resource: { @@ -173,7 +173,7 @@ export const useHandleTutorials = () => { }, }, { - title: t('tutorial:app.navigation', { + title: t('tutorial:apps.navigation', { postProcess: 'capitalize', }), resource: { From 07ed170fd71c85b58d3655f2d9d773f1f5a94f96 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 21:32:38 +0200 Subject: [PATCH 26/39] Use language detected from browser --- i18n.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/i18n.js b/i18n.js index e785beb..631d33a 100644 --- a/i18n.js +++ b/i18n.js @@ -25,10 +25,6 @@ i18n .use(initReactI18next) .use(capitalize) .init({ - debug: isDev, - fallbackLng: 'en', - ns: ['auth', 'core', 'tutorial'], - supportedLngs: ['en', 'it'], backend: { backends: [LocalStorageBackend, HttpBackend], backendOptions: [ @@ -40,9 +36,14 @@ i18n }, ], }, + debug: isDev, + fallbackLng: 'en', interpolation: { escapeValue: false, }, + lng: navigator.language, + ns: ['auth', 'core', 'tutorial'], + supportedLngs: ['en', 'it'], }); export default i18n; From ec7819e11da58b9a39880dbef8d6f34d695f2307 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 22:32:30 +0200 Subject: [PATCH 27/39] Add translation keys --- i18n.js | 2 +- public/locales/en/auth.json | 12 +++- public/locales/en/core.json | 10 +++ public/locales/it/auth.json | 13 +++- public/locales/it/core.json | 10 +++ public/locales/it/tutorial.json | 21 ++++++ src/App.tsx | 89 ++++++++++++++++--------- src/components/GeneralNotifications.tsx | 5 +- src/components/QMailStatus.tsx | 7 +- 9 files changed, 127 insertions(+), 42 deletions(-) create mode 100644 public/locales/it/tutorial.json diff --git a/i18n.js b/i18n.js index 631d33a..ddda868 100644 --- a/i18n.js +++ b/i18n.js @@ -14,7 +14,7 @@ const isDev = process.env.NODE_ENV === 'development'; const capitalize = { type: 'postProcessor', name: 'capitalize', - process: (value, key, options, translator) => { + process: (value) => { return value.charAt(0).toUpperCase() + value.slice(1); }, }; diff --git a/public/locales/en/auth.json b/public/locales/en/auth.json index 02c348d..36d2329 100644 --- a/public/locales/en/auth.json +++ b/public/locales/en/auth.json @@ -10,15 +10,23 @@ "key": "API key", "select_valid": "select a valid apikey" }, + "authenticate": "authenticate", "build_version": "build version", "create_account": "create account", - "return_to_list": "return to list", + "download_account": "download account", + "keep_secure": "Keep your account file secure", "node": { "choose": "choose custom node", "custom_many": "custom nodes", "use_custom": "use custom node", "use_local": "use local node", - "using": "using node" + "using": "using node", + "using_public": "using public node" }, + "password": "password", + "password_confirmation": "confirm password", + "return_to_list": "return to list", + "wallet_password_confirmation": "confirm wallet password", + "wallet_password": "wallet password", "welcome": "welcome to" } diff --git a/public/locales/en/core.json b/public/locales/en/core.json index 0674642..1f7bbab 100644 --- a/public/locales/en/core.json +++ b/public/locales/en/core.json @@ -1,17 +1,27 @@ { "add": "add", + "backup_wallet": "backup wallet", "cancel": "cancel", "choose": "choose", "close": "close", + "continue": "continue", "description": "description", "edit": "edit", "error": "an error occurred", "last_height": "last height", "loading": "loading...", + "logout": "logout", + "minting_status": "minting status", + "payment_notification": "payment notification", "price": "price", + "q_mail": "q-mail", "save": "save", + "settings": "settings", "supply": "supply", "title": "title", + "tutorial": "tutorial", + "your_account": "your account", + "user_lookup": "user lookup", "wallet": "wallet", "wallet_other": "wallets", "welcome": "welcome" diff --git a/public/locales/it/auth.json b/public/locales/it/auth.json index 306bd0f..6b820c7 100644 --- a/public/locales/it/auth.json +++ b/public/locales/it/auth.json @@ -10,15 +10,22 @@ "key": "chiave API", "select_valid": "selezione una chiave API valida" }, + "authenticate": "autenticazione", + "build_version": "versione build", + "download_account": "scarica account", + "keep_secure": "metti al sicuro il file del tuo account", "node": { "choose": "scegli un nodo custom", "custom_many": "nodi custom", "use_custom": "use nodo custom", "use_local": "usa nodo locale", - "using": "nodo in uso" + "using": "nodo in uso", + "using_public": "utilizzo nodo pubblico" }, - "build_version": "versione build", - "create_account": "crea un account", + "password": "password", + "password_confirmation": "confirma la password", + "wallet_password_confirmation": "conferma la password del wallet", "return_to_list": "ritorna alla lista", + "wallet_password": "password del wallet", "welcome": "benvenuto in" } diff --git a/public/locales/it/core.json b/public/locales/it/core.json index 6376e0a..bc6dd31 100644 --- a/public/locales/it/core.json +++ b/public/locales/it/core.json @@ -1,17 +1,27 @@ { "add": "aggiungi", + "backup_wallet": "backup wallet", "cancel": "cancella", "choose": "scegli", "close": "chiudi", + "continue": "continua", "description": "descrizione", "edit": "modifica", "error": "si è verificato un errore", "last_height": "ultimo blocco", "loading": "caricamento...", + "logout": "disconnetti", + "minting_status": "stato minting", + "payment_notification": "notifiche pagamenti", "price": "prezzo", + "q_mail": "q-mail", "save": "salva", + "settings": "impostazioni", "supply": "offerta", "title": "titolo", + "tutorial": "tutorial", + "your_account": "il tuo account", + "user_lookup": "ricerca utente", "wallet": "wallet", "wallet_other": "wallet", "welcome": "benvenuto" diff --git a/public/locales/it/tutorial.json b/public/locales/it/tutorial.json new file mode 100644 index 0000000..08fb1df --- /dev/null +++ b/public/locales/it/tutorial.json @@ -0,0 +1,21 @@ +{ + "1_getting_started": "1. Come iniziare", + "2_overview": "2. Overview", + "3_groups": "3. I gruppi in Qortal", + "4_obtain_qort": "4. Ottenere Qort", + "account_creation": "creazione account", + "important_info": "important information!", + "apps": { + "dashboard": "1. Dashboard delle app", + "navigation": "2. Navigation tra le app" + }, + "initial": { + "6_qort": "Avere almeno 6 QORT nel proprio wallet", + "explore": "esplora", + "general_chat": "chat generaleat", + "getting_started": "Come iniziare", + "register_name": "registra un nome", + "see_apps": "vedi le apps", + "trade_qort": "scambia i QORT" + } +} diff --git a/src/App.tsx b/src/App.tsx index 7d3a7c7..420e36f 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -136,6 +136,7 @@ import { QortPayment } from './components/QortPayment'; import { GeneralNotifications } from './components/GeneralNotifications'; import { PdfViewer } from './common/PdfViewer'; import ThemeSelector from './components/Theme/ThemeSelector.tsx'; +import { useTranslation } from 'react-i18next'; type extStates = | 'not-authenticated' @@ -316,6 +317,8 @@ function App() { const [sendqortState, setSendqortState] = useState(null); const [isLoading, setIsLoading] = useState(false); const [isLoadingSendCoin, setIsLoadingSendCoin] = useState(false); + + const { t } = useTranslation(['auth', 'core']); const theme = useTheme(); const [ @@ -1550,9 +1553,10 @@ function App() { style={{ fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - LOGOUT + {t('core:logout')} } placement="left" @@ -1589,9 +1593,10 @@ function App() { style={{ fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - SETTINGS + {t('core:settings')} } placement="left" @@ -1628,9 +1633,10 @@ function App() { style={{ fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - USER LOOKUP + {t('core:user_lookup')} } placement="left" @@ -1667,9 +1673,10 @@ function App() { style={{ fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - WALLETS + {t('core:wallet_other')} } placement="left" @@ -1703,9 +1710,10 @@ function App() { style={{ fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - YOUR ACCOUNT + {t('core:your_account')} } placement="left" @@ -1813,9 +1821,10 @@ function App() { style={{ fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - MINTING STATUS + {t('core:minting_status')} } placement="left" @@ -1857,9 +1866,10 @@ function App() { style={{ fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - TUTORIAL + {t('core:tutorial')} } placement="left" @@ -1894,8 +1904,14 @@ function App() { > - BACKUP WALLET + + {t('core:backup_wallet')} } placement="left" @@ -2083,6 +2099,7 @@ function App() { {messageQortalRequest?.text1} + {messageQortalRequest?.text2 && ( <> @@ -2124,6 +2141,7 @@ function App() { > {messageQortalRequest?.text3} + @@ -2158,11 +2176,11 @@ function App() { {messageQortalRequest?.highlightedText} @@ -2379,17 +2397,7 @@ function App() { > {sendqortState?.amount} QORT - {/* - - Confirm Wallet Password - - - setPaymentPassword(e.target.value)} - /> */} - Create account + {t('auth:create_account', { postProcess: 'capitalize' })} )} @@ -2624,7 +2632,7 @@ function App() { fontWeight: 600, }} > - Authenticate + {t('auth:authenticate', { postProcess: 'capitalize' })} @@ -2632,7 +2640,7 @@ function App() { <> - Wallet Password + {t('auth:wallet_password', { postProcess: 'capitalize' })} @@ -2656,7 +2664,8 @@ function App() { fontSize: '12px', }} > - {'Using node: '} {currentNode?.url} + {t('auth:node.using', { postProcess: 'capitalize' })}:{' '} + {currentNode?.url} ) : ( @@ -2667,7 +2676,7 @@ function App() { fontSize: '12px', }} > - {'Using public node'} + {t('auth:node.using_public', { postProcess: 'capitalize' })} )} @@ -2675,7 +2684,7 @@ function App() { - Authenticate + {t('auth:authenticate', { postProcess: 'capitalize' })} {walletToBeDecryptedError} @@ -2703,7 +2712,9 @@ function App() { onClick={returnToMain} /> + +

- Download Account + {t('auth:download_account', { postProcess: 'capitalize' })} @@ -2740,9 +2751,13 @@ function App() { {!walletToBeDownloaded && ( <> - Confirm Wallet Password + {t('auth:wallet_password_confirmation', { + postProcess: 'capitalize', + })} + + + + - Confirm password + {t('auth:password_confirmation', { + postProcess: 'capitalize', + })} {walletToBeDownloadedError} @@ -2764,11 +2783,15 @@ function App() { onClick={async () => { await saveFileToDiskFunc(); await showInfo({ - message: `Keep your account file secure.`, + message: t('auth:keep_secure', { + postProcess: 'capitalize', + }), }); }} > - Download account + {t('auth:download_account', { + postProcess: 'capitalize', + })} )} @@ -3024,7 +3047,7 @@ function App() { - Create Account + {t('auth:create_account', { postProcess: 'capitalize' })} {walletToBeDownloadedError} diff --git a/src/components/GeneralNotifications.tsx b/src/components/GeneralNotifications.tsx index 97c498b..6335dbf 100644 --- a/src/components/GeneralNotifications.tsx +++ b/src/components/GeneralNotifications.tsx @@ -14,6 +14,7 @@ import AccountBalanceWalletIcon from '@mui/icons-material/AccountBalanceWallet'; import { formatDate } from '../utils/time'; import { useHandlePaymentNotification } from '../hooks/useHandlePaymentNotification'; import { executeEvent } from '../utils/events'; +import { useTranslation } from 'react-i18next'; export const GeneralNotifications = ({ address }) => { const [anchorEl, setAnchorEl] = useState(null); @@ -31,6 +32,7 @@ export const GeneralNotifications = ({ address }) => { setAnchorEl(event.currentTarget); }; + const { t } = useTranslation(['core']); const theme = useTheme(); return ( @@ -48,9 +50,10 @@ export const GeneralNotifications = ({ address }) => { color: theme.palette.text.primary, fontSize: '14px', fontWeight: 700, + textTransform: 'uppercase', }} > - PAYMENT NOTIFICATION + {t('core:payment_notification')} } placement="left" diff --git a/src/components/QMailStatus.tsx b/src/components/QMailStatus.tsx index c760751..dd6f9be 100644 --- a/src/components/QMailStatus.tsx +++ b/src/components/QMailStatus.tsx @@ -1,13 +1,14 @@ import { useMemo } from 'react'; -import EmailIcon from '@mui/icons-material/Email'; import { useRecoilState } from 'recoil'; import { mailsAtom, qMailLastEnteredTimestampAtom } from '../atoms/global'; import { isLessThanOneWeekOld } from './Group/QMailMessages'; import { ButtonBase, Tooltip, useTheme } from '@mui/material'; import { executeEvent } from '../utils/events'; import { Mail } from '@mui/icons-material'; +import { useTranslation } from 'react-i18next'; export const QMailStatus = () => { + const { t } = useTranslation(['core']); const theme = useTheme(); const [lastEnteredTimestamp, setLastEnteredTimestamp] = useRecoilState( @@ -63,7 +64,9 @@ export const QMailStatus = () => { fontWeight: 700, }} > - Q-MAIL + {t('core:q_mail', { + postProcess: 'capitalize', + })} } placement="left" From 801366a0fb490edb85635c7bbc1a889ae86722ce Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Mon, 21 Apr 2025 22:39:23 +0200 Subject: [PATCH 28/39] Add languages (fr, es, de) --- i18n.js | 2 +- public/locales/de/auth.json | 32 ++++++++++++++++++++++++++++++++ public/locales/de/core.json | 28 ++++++++++++++++++++++++++++ public/locales/de/tutorial.json | 21 +++++++++++++++++++++ public/locales/es/auth.json | 32 ++++++++++++++++++++++++++++++++ public/locales/es/core.json | 28 ++++++++++++++++++++++++++++ public/locales/es/tutorial.json | 21 +++++++++++++++++++++ public/locales/fr/auth.json | 32 ++++++++++++++++++++++++++++++++ public/locales/fr/core.json | 28 ++++++++++++++++++++++++++++ public/locales/fr/tutorial.json | 21 +++++++++++++++++++++ public/locales/it/auth.json | 1 + 11 files changed, 245 insertions(+), 1 deletion(-) create mode 100644 public/locales/de/auth.json create mode 100644 public/locales/de/core.json create mode 100644 public/locales/de/tutorial.json create mode 100644 public/locales/es/auth.json create mode 100644 public/locales/es/core.json create mode 100644 public/locales/es/tutorial.json create mode 100644 public/locales/fr/auth.json create mode 100644 public/locales/fr/core.json create mode 100644 public/locales/fr/tutorial.json diff --git a/i18n.js b/i18n.js index ddda868..43f8663 100644 --- a/i18n.js +++ b/i18n.js @@ -43,7 +43,7 @@ i18n }, lng: navigator.language, ns: ['auth', 'core', 'tutorial'], - supportedLngs: ['en', 'it'], + supportedLngs: ['en', 'it', 'es', 'fr', 'de'], }); export default i18n; diff --git a/public/locales/de/auth.json b/public/locales/de/auth.json new file mode 100644 index 0000000..3e40c57 --- /dev/null +++ b/public/locales/de/auth.json @@ -0,0 +1,32 @@ +{ + "account_many": "Konten", + "account_one": "Konto", + "advanced_users": "für fortgeschrittene Benutzer", + "apikey": { + "alternative": "Alternative: Datei auswählen", + "change": "API-Schlüssel ändern", + "enter": "API-Schlüssel eingeben", + "import": "API-Schlüssel importieren", + "key": "API-Schlüssel", + "select_valid": "gültigen API-Schlüssel auswählen" + }, + "authenticate": "authentifizieren", + "build_version": "Build-Version", + "create_account": "Konto erstellen", + "download_account": "Konto herunterladen", + "keep_secure": "Bewahren Sie Ihre Kontodatei sicher auf", + "node": { + "choose": "benutzerdefinierten Node auswählen", + "custom_many": "benutzerdefinierte Nodes", + "use_custom": "benutzerdefinierten Node verwenden", + "use_local": "lokalen Node verwenden", + "using": "verwende Node", + "using_public": "öffentlichen Node verwenden" + }, + "password": "Passwort", + "password_confirmation": "Passwort bestätigen", + "return_to_list": "zurück zur Liste", + "wallet_password_confirmation": "Wallet-Passwort bestätigen", + "wallet_password": "Wallet-Passwort", + "welcome": "willkommen bei" +} diff --git a/public/locales/de/core.json b/public/locales/de/core.json new file mode 100644 index 0000000..be16346 --- /dev/null +++ b/public/locales/de/core.json @@ -0,0 +1,28 @@ +{ + "add": "hinzufügen", + "backup_wallet": "Wallet sichern", + "cancel": "abbrechen", + "choose": "auswählen", + "close": "schließen", + "continue": "fortfahren", + "description": "Beschreibung", + "edit": "bearbeiten", + "error": "ein Fehler ist aufgetreten", + "last_height": "letzte Höhe", + "loading": "wird geladen...", + "logout": "abmelden", + "minting_status": "Minting-Status", + "payment_notification": "Zahlungsbenachrichtigung", + "price": "Preis", + "q_mail": "q-Mail", + "save": "speichern", + "settings": "Einstellungen", + "supply": "Angebot", + "title": "Titel", + "tutorial": "Tutorial", + "your_account": "dein Konto", + "user_lookup": "Benutzersuche", + "wallet": "Wallet", + "wallet_other": "Wallets", + "welcome": "willkommen" +} diff --git a/public/locales/de/tutorial.json b/public/locales/de/tutorial.json new file mode 100644 index 0000000..f789e2b --- /dev/null +++ b/public/locales/de/tutorial.json @@ -0,0 +1,21 @@ +{ + "1_getting_started": "1. Erste Schritte", + "2_overview": "2. Überblick", + "3_groups": "3. Qortal-Gruppen", + "4_obtain_qort": "4. QORT erhalten", + "account_creation": "Kontoerstellung", + "important_info": "wichtige Informationen!", + "apps": { + "dashboard": "1. App-Dashboard", + "navigation": "2. App-Navigation" + }, + "initial": { + "6_qort": "Mindestens 6 QORT im Wallet haben", + "explore": "erkunden", + "general_chat": "allgemeiner Chat", + "getting_started": "erste Schritte", + "register_name": "einen Namen registrieren", + "see_apps": "Apps ansehen", + "trade_qort": "QORT handeln" + } +} diff --git a/public/locales/es/auth.json b/public/locales/es/auth.json new file mode 100644 index 0000000..93fd943 --- /dev/null +++ b/public/locales/es/auth.json @@ -0,0 +1,32 @@ +{ + "account_many": "cuentas", + "account_one": "cuenta", + "advanced_users": "para usuarios avanzados", + "apikey": { + "alternative": "alternativa: Seleccionar archivo", + "change": "cambiar clave API", + "enter": "ingresar clave API", + "import": "importar clave API", + "key": "clave API", + "select_valid": "selecciona una clave API válida" + }, + "authenticate": "autenticar", + "build_version": "versión de compilación", + "create_account": "crear cuenta", + "download_account": "descargar cuenta", + "keep_secure": "Mantén tu archivo de cuenta seguro", + "node": { + "choose": "elegir nodo personalizado", + "custom_many": "nodos personalizados", + "use_custom": "usar nodo personalizado", + "use_local": "usar nodo local", + "using": "usando nodo", + "using_public": "usando nodo público" + }, + "password": "contraseña", + "password_confirmation": "confirmar contraseña", + "return_to_list": "volver a la lista", + "wallet_password_confirmation": "confirmar contraseña del monedero", + "wallet_password": "contraseña del monedero", + "welcome": "bienvenido a" +} diff --git a/public/locales/es/core.json b/public/locales/es/core.json new file mode 100644 index 0000000..9da6f10 --- /dev/null +++ b/public/locales/es/core.json @@ -0,0 +1,28 @@ +{ + "add": "añadir", + "backup_wallet": "copia de seguridad del monedero", + "cancel": "cancelar", + "choose": "elegir", + "close": "cerrar", + "continue": "continuar", + "description": "descripción", + "edit": "editar", + "error": "ocurrió un error", + "last_height": "última altura", + "loading": "cargando...", + "logout": "cerrar sesión", + "minting_status": "estado de acuñación", + "payment_notification": "notificación de pago", + "price": "precio", + "q_mail": "q-mail", + "save": "guardar", + "settings": "configuración", + "supply": "suministro", + "title": "título", + "tutorial": "tutorial", + "your_account": "tu cuenta", + "user_lookup": "búsqueda de usuario", + "wallet": "monedero", + "wallet_other": "monederos", + "welcome": "bienvenido" +} diff --git a/public/locales/es/tutorial.json b/public/locales/es/tutorial.json new file mode 100644 index 0000000..8b89781 --- /dev/null +++ b/public/locales/es/tutorial.json @@ -0,0 +1,21 @@ +{ + "1_getting_started": "1. Comenzando", + "2_overview": "2. Visión general", + "3_groups": "3. Grupos de Qortal", + "4_obtain_qort": "4. Obtener QORT", + "account_creation": "creación de cuenta", + "important_info": "¡información importante!", + "apps": { + "dashboard": "1. Panel de aplicaciones", + "navigation": "2. Navegación de aplicaciones" + }, + "initial": { + "6_qort": "Tener al menos 6 QORT en tu monedero", + "explore": "explorar", + "general_chat": "chat general", + "getting_started": "comenzando", + "register_name": "registrar un nombre", + "see_apps": "ver aplicaciones", + "trade_qort": "intercambiar QORT" + } +} diff --git a/public/locales/fr/auth.json b/public/locales/fr/auth.json new file mode 100644 index 0000000..d6e4c16 --- /dev/null +++ b/public/locales/fr/auth.json @@ -0,0 +1,32 @@ +{ + "account_many": "comptes", + "account_one": "compte", + "advanced_users": "pour les utilisateurs avancés", + "apikey": { + "alternative": "alternative : Sélectionner un fichier", + "change": "changer la clé API", + "enter": "entrer la clé API", + "import": "importer la clé API", + "key": "clé API", + "select_valid": "sélectionnez une clé API valide" + }, + "authenticate": "authentifier", + "build_version": "version de build", + "create_account": "créer un compte", + "download_account": "télécharger le compte", + "keep_secure": "Gardez votre fichier de compte en sécurité", + "node": { + "choose": "choisir un nœud personnalisé", + "custom_many": "nœuds personnalisés", + "use_custom": "utiliser un nœud personnalisé", + "use_local": "utiliser un nœud local", + "using": "utilise le nœud", + "using_public": "utilise un nœud public" + }, + "password": "mot de passe", + "password_confirmation": "confirmer le mot de passe", + "return_to_list": "retour à la liste", + "wallet_password_confirmation": "confirmer le mot de passe du portefeuille", + "wallet_password": "mot de passe du portefeuille", + "welcome": "bienvenue sur" +} diff --git a/public/locales/fr/core.json b/public/locales/fr/core.json new file mode 100644 index 0000000..65191ab --- /dev/null +++ b/public/locales/fr/core.json @@ -0,0 +1,28 @@ +{ + "add": "ajouter", + "backup_wallet": "sauvegarde du portefeuille", + "cancel": "annuler", + "choose": "choisir", + "close": "fermer", + "continue": "continuer", + "description": "description", + "edit": "éditer", + "error": "une erreur est survenue", + "last_height": "hauteur finale", + "loading": "chargement...", + "logout": "se déconnecter", + "minting_status": "statut de minage", + "payment_notification": "notification de paiement", + "price": "prix", + "q_mail": "q-mail", + "save": "enregistrer", + "settings": "paramètres", + "supply": "approvisionnement", + "title": "titre", + "tutorial": "tutoriel", + "your_account": "votre compte", + "user_lookup": "recherche d'utilisateur", + "wallet": "portefeuille", + "wallet_other": "portefeuilles", + "welcome": "bienvenue" +} diff --git a/public/locales/fr/tutorial.json b/public/locales/fr/tutorial.json new file mode 100644 index 0000000..13a33cd --- /dev/null +++ b/public/locales/fr/tutorial.json @@ -0,0 +1,21 @@ +{ + "1_getting_started": "1. Démarrer", + "2_overview": "2. Aperçu", + "3_groups": "3. Groupes Qortal", + "4_obtain_qort": "4. Obtenir des QORT", + "account_creation": "création de compte", + "important_info": "informations importantes !", + "apps": { + "dashboard": "1. Tableau de bord des applications", + "navigation": "2. Navigation des applications" + }, + "initial": { + "6_qort": "Avoir au moins 6 QORT dans votre portefeuille", + "explore": "explorer", + "general_chat": "chat général", + "getting_started": "démarrer", + "register_name": "enregistrer un nom", + "see_apps": "voir les applications", + "trade_qort": "échanger des QORT" + } +} diff --git a/public/locales/it/auth.json b/public/locales/it/auth.json index 6b820c7..e6b35da 100644 --- a/public/locales/it/auth.json +++ b/public/locales/it/auth.json @@ -12,6 +12,7 @@ }, "authenticate": "autenticazione", "build_version": "versione build", + "create_account": "crea un account", "download_account": "scarica account", "keep_secure": "metti al sicuro il file del tuo account", "node": { From 2276e8020716e03cfaac7eca5fb9c515c55d99cc Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Tue, 22 Apr 2025 00:20:33 +0200 Subject: [PATCH 29/39] Add russian --- i18n.js | 2 +- public/locales/ru/auth.json | 32 ++++++++++++++++++++++++++++++++ public/locales/ru/core.json | 28 ++++++++++++++++++++++++++++ public/locales/ru/tutorial.json | 21 +++++++++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 public/locales/ru/auth.json create mode 100644 public/locales/ru/core.json create mode 100644 public/locales/ru/tutorial.json diff --git a/i18n.js b/i18n.js index 43f8663..78df3c1 100644 --- a/i18n.js +++ b/i18n.js @@ -43,7 +43,7 @@ i18n }, lng: navigator.language, ns: ['auth', 'core', 'tutorial'], - supportedLngs: ['en', 'it', 'es', 'fr', 'de'], + supportedLngs: ['en', 'it', 'es', 'fr', 'de', 'ru'], }); export default i18n; diff --git a/public/locales/ru/auth.json b/public/locales/ru/auth.json new file mode 100644 index 0000000..5a47cc2 --- /dev/null +++ b/public/locales/ru/auth.json @@ -0,0 +1,32 @@ +{ + "account_many": "аккаунты", + "account_one": "аккаунт", + "advanced_users": "для продвинутых пользователей", + "apikey": { + "alternative": "альтернатива: выбрать файл", + "change": "изменить API-ключ", + "enter": "введите API-ключ", + "import": "импортировать API-ключ", + "key": "API-ключ", + "select_valid": "выберите действительный API-ключ" + }, + "authenticate": "аутентификация", + "build_version": "версия сборки", + "create_account": "создать аккаунт", + "download_account": "скачать аккаунт", + "keep_secure": "Храните файл аккаунта в безопасности", + "node": { + "choose": "выбрать пользовательский узел", + "custom_many": "пользовательские узлы", + "use_custom": "использовать пользовательский узел", + "use_local": "использовать локальный узел", + "using": "используется узел", + "using_public": "используется публичный узел" + }, + "password": "пароль", + "password_confirmation": "подтвердите пароль", + "return_to_list": "вернуться к списку", + "wallet_password_confirmation": "подтвердите пароль кошелька", + "wallet_password": "пароль кошелька", + "welcome": "добро пожаловать в" +} diff --git a/public/locales/ru/core.json b/public/locales/ru/core.json new file mode 100644 index 0000000..2dc0810 --- /dev/null +++ b/public/locales/ru/core.json @@ -0,0 +1,28 @@ +{ + "add": "добавить", + "backup_wallet": "резервная копия кошелька", + "cancel": "отмена", + "choose": "выбрать", + "close": "закрыть", + "continue": "продолжить", + "description": "описание", + "edit": "редактировать", + "error": "произошла ошибка", + "last_height": "последняя высота", + "loading": "загрузка...", + "logout": "выйти", + "minting_status": "статус майнинга", + "payment_notification": "уведомление о платеже", + "price": "цена", + "q_mail": "q-mail", + "save": "сохранить", + "settings": "настройки", + "supply": "предложение", + "title": "заголовок", + "tutorial": "руководство", + "your_account": "ваш аккаунт", + "user_lookup": "поиск пользователя", + "wallet": "кошелек", + "wallet_other": "кошельки", + "welcome": "добро пожаловать" +} diff --git a/public/locales/ru/tutorial.json b/public/locales/ru/tutorial.json new file mode 100644 index 0000000..ca669c5 --- /dev/null +++ b/public/locales/ru/tutorial.json @@ -0,0 +1,21 @@ +{ + "1_getting_started": "1. Начало работы", + "2_overview": "2. Обзор", + "3_groups": "3. Группы Qortal", + "4_obtain_qort": "4. Получение QORT", + "account_creation": "создание аккаунта", + "important_info": "важная информация!", + "apps": { + "dashboard": "1. Панель приложений", + "navigation": "2. Навигация по приложениям" + }, + "initial": { + "6_qort": "Иметь не менее 6 QORT в кошельке", + "explore": "исследовать", + "general_chat": "общий чат", + "getting_started": "начало работы", + "register_name": "зарегистрировать имя", + "see_apps": "посмотреть приложения", + "trade_qort": "обмен QORT" + } +} From b785cdac4d1375091bed48061e71e8fb32bd3dd4 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Tue, 22 Apr 2025 00:22:31 +0200 Subject: [PATCH 30/39] Set to lowercase --- public/locales/de/tutorial.json | 4 ++-- public/locales/en/tutorial.json | 2 +- public/locales/es/tutorial.json | 2 +- public/locales/fr/tutorial.json | 2 +- public/locales/ru/tutorial.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/public/locales/de/tutorial.json b/public/locales/de/tutorial.json index f789e2b..14a7021 100644 --- a/public/locales/de/tutorial.json +++ b/public/locales/de/tutorial.json @@ -10,12 +10,12 @@ "navigation": "2. App-Navigation" }, "initial": { - "6_qort": "Mindestens 6 QORT im Wallet haben", + "6_qort": "mindestens 6 QORT im Wallet haben", "explore": "erkunden", "general_chat": "allgemeiner Chat", "getting_started": "erste Schritte", "register_name": "einen Namen registrieren", - "see_apps": "Apps ansehen", + "see_apps": "apps ansehen", "trade_qort": "QORT handeln" } } diff --git a/public/locales/en/tutorial.json b/public/locales/en/tutorial.json index f022388..08c7628 100644 --- a/public/locales/en/tutorial.json +++ b/public/locales/en/tutorial.json @@ -10,7 +10,7 @@ "navigation": "2. Apps Navigation" }, "initial": { - "6_qort": "Have at least 6 QORT in your wallet", + "6_qort": "have at least 6 QORT in your wallet", "explore": "explore", "general_chat": "general chat", "getting_started": "getting started", diff --git a/public/locales/es/tutorial.json b/public/locales/es/tutorial.json index 8b89781..c60e829 100644 --- a/public/locales/es/tutorial.json +++ b/public/locales/es/tutorial.json @@ -10,7 +10,7 @@ "navigation": "2. Navegación de aplicaciones" }, "initial": { - "6_qort": "Tener al menos 6 QORT en tu monedero", + "6_qort": "tener al menos 6 QORT en tu monedero", "explore": "explorar", "general_chat": "chat general", "getting_started": "comenzando", diff --git a/public/locales/fr/tutorial.json b/public/locales/fr/tutorial.json index 13a33cd..0d3ef04 100644 --- a/public/locales/fr/tutorial.json +++ b/public/locales/fr/tutorial.json @@ -10,7 +10,7 @@ "navigation": "2. Navigation des applications" }, "initial": { - "6_qort": "Avoir au moins 6 QORT dans votre portefeuille", + "6_qort": "avoir au moins 6 QORT dans votre portefeuille", "explore": "explorer", "general_chat": "chat général", "getting_started": "démarrer", diff --git a/public/locales/ru/tutorial.json b/public/locales/ru/tutorial.json index ca669c5..405fdd0 100644 --- a/public/locales/ru/tutorial.json +++ b/public/locales/ru/tutorial.json @@ -10,7 +10,7 @@ "navigation": "2. Навигация по приложениям" }, "initial": { - "6_qort": "Иметь не менее 6 QORT в кошельке", + "6_qort": "иметь не менее 6 QORT в кошельке", "explore": "исследовать", "general_chat": "общий чат", "getting_started": "начало работы", From 284a8d01f9b4a0adbae3f22e86f6a32eb31e0bd7 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Tue, 22 Apr 2025 00:22:39 +0200 Subject: [PATCH 31/39] Set to lowercase --- public/locales/it/tutorial.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/locales/it/tutorial.json b/public/locales/it/tutorial.json index 08fb1df..27a270c 100644 --- a/public/locales/it/tutorial.json +++ b/public/locales/it/tutorial.json @@ -10,10 +10,10 @@ "navigation": "2. Navigation tra le app" }, "initial": { - "6_qort": "Avere almeno 6 QORT nel proprio wallet", + "6_qort": "avere almeno 6 QORT nel proprio wallet", "explore": "esplora", "general_chat": "chat generaleat", - "getting_started": "Come iniziare", + "getting_started": "come iniziare", "register_name": "registra un nome", "see_apps": "vedi le apps", "trade_qort": "scambia i QORT" From 0026b7c24997276c6c313e6e66e69b56c79668e0 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Wed, 23 Apr 2025 09:27:24 +0200 Subject: [PATCH 32/39] Save translations --- public/locales/en/core.json | 16 ++++++++++-- public/locales/it/tutorial.json | 2 +- src/components/Save/Save.tsx | 44 +++++++++++++++++++++++---------- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/public/locales/en/core.json b/public/locales/en/core.json index 1f7bbab..01261da 100644 --- a/public/locales/en/core.json +++ b/public/locales/en/core.json @@ -7,7 +7,7 @@ "continue": "continue", "description": "description", "edit": "edit", - "error": "an error occurred", + "last_height": "last height", "loading": "loading...", "logout": "logout", @@ -15,7 +15,19 @@ "payment_notification": "payment notification", "price": "price", "q_mail": "q-mail", - "save": "save", + "result": { + "error": { + "generic": "an error occurred", + "save_qdn": "Unable to save to QDN" + }, + "success": { + "publish_qdn": "Sucessfully published to QDN" + } + }, + "save_options": { + "publish_qdn": "Would you like to publish your settings to QDN (encrypted) ?", + "save": "save" + }, "settings": "settings", "supply": "supply", "title": "title", diff --git a/public/locales/it/tutorial.json b/public/locales/it/tutorial.json index 27a270c..511b7cb 100644 --- a/public/locales/it/tutorial.json +++ b/public/locales/it/tutorial.json @@ -12,7 +12,7 @@ "initial": { "6_qort": "avere almeno 6 QORT nel proprio wallet", "explore": "esplora", - "general_chat": "chat generaleat", + "general_chat": "chat generale", "getting_started": "come iniziare", "register_name": "registra un nome", "see_apps": "vedi le apps", diff --git a/src/components/Save/Save.tsx b/src/components/Save/Save.tsx index c8196d8..9e35e66 100644 --- a/src/components/Save/Save.tsx +++ b/src/components/Save/Save.tsx @@ -1,6 +1,6 @@ -import React, { useContext, useEffect, useMemo, useState } from 'react'; +import { useContext, useEffect, useMemo, useState } from 'react'; import { useRecoilState, useSetRecoilState } from 'recoil'; -import isEqual from 'lodash/isEqual'; // Import deep comparison utility +import isEqual from 'lodash/isEqual'; // TODO Import deep comparison utility import { canSaveSettingToQdnAtom, hasSettingsChangedAtom, @@ -26,6 +26,7 @@ import { base64ToUint8Array, uint8ArrayToObject, } from '../../backgroundFunctions/encryption'; +import { useTranslation } from 'react-i18next'; export const handleImportClick = async () => { const fileInput = document.createElement('input'); @@ -77,6 +78,8 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { const [anchorEl, setAnchorEl] = useState(null); const { show } = useContext(MyContext); + const { t } = useTranslation(['core']); + const hasChanged = useMemo(() => { const newChanges = { sortablePinnedApps: pinnedApps.map((item) => { @@ -146,8 +149,7 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { const fee = await getFee('ARBITRARY'); await show({ - message: - 'Would you like to publish your settings to QDN (encrypted) ?', + message: t('core:save.publish_qnd', { postProcess: 'capitalize' }), publishFee: fee.fee + ' QORT', }); const response = await new Promise((res, rej) => { @@ -165,7 +167,10 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { rej(response.error); }) .catch((error) => { - rej(error.message || 'An error occurred'); + rej( + error.message || + t('core:result.error.generic', { postProcess: 'capitalize' }) + ); }); }); if (response?.identifier) { @@ -173,7 +178,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { setSettingsQdnLastUpdated(Date.now()); setInfoSnack({ type: 'success', - message: 'Sucessfully published to QDN', + message: t('core:result.success.publish_qdn', { + postProcess: 'capitalize', + }), }); setOpenSnack(true); setAnchorEl(null); @@ -182,7 +189,11 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { } catch (error) { setInfoSnack({ type: 'error', - message: error?.message || 'Unable to save to QDN', + message: + error?.message || + t('core:result.error.save_qdn', { + postProcess: 'capitalize', + }), }); setOpenSnack(true); } finally { @@ -214,7 +225,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { {isDesktop ? ( { )} + { {isUsingImportExportSettings && ( { }} > You are using the export/import way of saving settings. - + {' '} + // TODO: translate @@ -338,8 +341,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { fontSize: '14px', }} > - You need a registered Qortal name to save your pinned apps to - QDN. + {t('core:save_options.register_name', { + postProcess: 'capitalize', + })} ) : ( @@ -358,8 +362,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { fontSize: '14px', }} > - You have unsaved changes to your pinned apps. Save them to - QDN. + {t('core:save_options.unsaved_changes', { + postProcess: 'capitalize', + })} @@ -381,7 +386,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { onClick={saveToQdn} variant="contained" > - Save to QDN + {t('core:save_options.save_qdn', { + postProcess: 'capitalize', + })} {!isNaN(settingsQdnLastUpdated) && @@ -392,8 +399,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { fontSize: '14px', }} > - Don't like your current local changes? Would you - like to reset to your saved QDN pinned apps? + {t('core:save_options.reset_qdn', { + postProcess: 'capitalize', + })} { }, }} > - Revert to QDN + {t('core:save_options.revert_qdn', { + postProcess: 'capitalize', + })} )} @@ -425,8 +435,10 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { fontSize: '14px', }} > - Don't like your current local changes? Would you - like to reset to the default pinned apps? + {' '} + {t('core:save_options.reset_pinned', { + postProcess: 'capitalize', + })} { onClick={revertChanges} variant="contained" > - Revert to default + {t('core:save_options.revert_default', { + postProcess: 'capitalize', + })} )} @@ -456,8 +470,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { fontSize: '14px', }} > - The app was unable to download your existing QDN-saved - pinned apps. Would you like to overwrite those changes? + {t('core:save_options.overwrite_changes', { + postProcess: 'capitalize', + })} { }, }} > - Overwrite to QDN + {t('core:save_options.overwrite_qdn', { + postProcess: 'capitalize', + })} )} @@ -495,7 +512,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { fontSize: '14px', }} > - You currently do not have any changes to your pinned apps + {t('core:save_options.no_pinned_changes', { + postProcess: 'capitalize', + })} )} @@ -550,7 +569,9 @@ export const Save = ({ isDesktop, disableWidth, myName }) => { } }} > - Import + {t('core:import', { + postProcess: 'capitalize', + })} { } }} > - Export + {t('core:export', { + postProcess: 'capitalize', + })} From d796a3f7c025205f70e0fd7040207d9b22a893e7 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Wed, 23 Apr 2025 20:49:30 +0200 Subject: [PATCH 38/39] Add comment TODO, format code and remove unused import --- src/components/Group/AddGroup.tsx | 2 +- src/components/Group/AddGroupList.tsx | 2 +- src/components/Group/BlockedUsersModal.tsx | 2 +- src/components/Group/Forum/DisplayHtml.tsx | 34 +- src/components/Group/Forum/GroupMail.tsx | 18 +- src/components/Group/Forum/Mail-styles.ts | 728 +++++++++--------- src/components/Group/Forum/NewThread.tsx | 2 +- src/components/Group/Forum/ReadOnlySlate.tsx | 87 +-- .../Group/Forum/ShowMessageWithoutModal.tsx | 300 ++++---- src/components/Group/Forum/TextEditor.tsx | 33 +- src/components/Group/Forum/Thread.tsx | 3 +- src/components/Group/Group.tsx | 75 +- src/components/Group/GroupInvites.tsx | 2 +- src/components/Group/GroupJoinRequests.tsx | 3 +- src/components/Group/GroupMenu.tsx | 274 ++++--- src/components/Group/InviteMember.tsx | 12 +- src/components/Group/ListOfBans.tsx | 138 ++-- .../Group/ListOfGroupPromotions.tsx | 2 +- src/components/Group/ListOfInvites.tsx | 145 ++-- src/components/Group/ListOfJoinRequests.tsx | 161 ++-- src/components/Group/ListOfMembers.tsx | 183 ++--- .../Group/ListOfThreadPostsWatched.tsx | 2 +- src/components/Group/ManageMembers.tsx | 2 +- src/components/Group/QMailMessages.tsx | 2 +- src/components/Group/Settings.tsx | 2 +- src/components/Group/UserListOfInvites.tsx | 434 ++++++----- src/components/Group/WalletsAppWrapper.tsx | 2 +- src/components/Group/WebsocketActive.tsx | 82 +- src/components/Group/useBlockUsers.tsx | 316 ++++---- src/components/Group/useHandleUserInfo.tsx | 40 +- src/components/Home/NewUsersCTA.tsx | 58 +- src/components/Minting/Minting.tsx | 3 +- 32 files changed, 1689 insertions(+), 1460 deletions(-) diff --git a/src/components/Group/AddGroup.tsx b/src/components/Group/AddGroup.tsx index 470cd3f..91552cb 100644 --- a/src/components/Group/AddGroup.tsx +++ b/src/components/Group/AddGroup.tsx @@ -91,7 +91,7 @@ export const AddGroup = ({ address, open, setOpen }) => { if (!name) throw new Error('Please provide a name'); if (!description) throw new Error('Please provide a description'); - const fee = await getFee('CREATE_GROUP'); + const fee = await getFee('CREATE_GROUP'); // TODO translate await show({ message: 'Would you like to perform an CREATE_GROUP transaction?', publishFee: fee.fee + ' QORT', diff --git a/src/components/Group/AddGroupList.tsx b/src/components/Group/AddGroupList.tsx index 433d0e4..b80cc34 100644 --- a/src/components/Group/AddGroupList.tsx +++ b/src/components/Group/AddGroupList.tsx @@ -101,7 +101,7 @@ export const AddGroupList = ({ setInfoSnack, setOpenSnack }) => { const handleJoinGroup = async (group, isOpen) => { try { const groupId = group.groupId; - const fee = await getFee('JOIN_GROUP'); + const fee = await getFee('JOIN_GROUP'); // TODO translate await show({ message: 'Would you like to perform an JOIN_GROUP transaction?', publishFee: fee.fee + ' QORT', diff --git a/src/components/Group/BlockedUsersModal.tsx b/src/components/Group/BlockedUsersModal.tsx index b2d58e7..80d9c4c 100644 --- a/src/components/Group/BlockedUsersModal.tsx +++ b/src/components/Group/BlockedUsersModal.tsx @@ -129,7 +129,7 @@ export const BlockedUsersModal = () => { executeEvent('updateChatMessagesWithBlocks', true); } } catch (error) { - setOpenSnackGlobal(true); + setOpenSnackGlobal(true); // TODO translate setInfoSnackCustom({ type: 'error', message: error?.message || 'Unable to block user', diff --git a/src/components/Group/Forum/DisplayHtml.tsx b/src/components/Group/Forum/DisplayHtml.tsx index 5bae4a7..786672a 100644 --- a/src/components/Group/Forum/DisplayHtml.tsx +++ b/src/components/Group/Forum/DisplayHtml.tsx @@ -1,21 +1,20 @@ -import { useMemo } from "react"; -import DOMPurify from "dompurify"; -import "react-quill/dist/quill.snow.css"; -import "react-quill/dist/quill.core.css"; -import "react-quill/dist/quill.bubble.css"; -import { Box, styled } from "@mui/material"; -import { convertQortalLinks } from "../../../utils/qortalLink"; - +import { useMemo } from 'react'; +import DOMPurify from 'dompurify'; +import 'react-quill/dist/quill.snow.css'; +import 'react-quill/dist/quill.core.css'; +import 'react-quill/dist/quill.bubble.css'; +import { Box, styled } from '@mui/material'; +import { convertQortalLinks } from '../../../utils/qortalLink'; const CrowdfundInlineContent = styled(Box)(({ theme }) => ({ - display: "flex", - fontFamily: "Mulish", - fontSize: "19px", - fontWeight: 400, - letterSpacing: 0, - color: theme.palette.text.primary, - width: '100%' - })); + display: 'flex', + fontFamily: 'Mulish', + fontSize: '19px', + fontWeight: 400, + letterSpacing: 0, + color: theme.palette.text.primary, + width: '100%', +})); export const DisplayHtml = ({ html, textColor }: any) => { const cleanContent = useMemo(() => { @@ -29,6 +28,7 @@ export const DisplayHtml = ({ html, textColor }: any) => { }, [html]); if (!cleanContent) return null; + return (
{ style={{ color: textColor || 'white', fontWeight: 400, - fontSize: '16px' + fontSize: '16px', }} dangerouslySetInnerHTML={{ __html: cleanContent }} /> diff --git a/src/components/Group/Forum/GroupMail.tsx b/src/components/Group/Forum/GroupMail.tsx index 544634b..3c8972f 100644 --- a/src/components/Group/Forum/GroupMail.tsx +++ b/src/components/Group/Forum/GroupMail.tsx @@ -45,7 +45,6 @@ import { formatDate, formatTimestamp } from '../../../utils/time'; import LazyLoad from '../../../common/LazyLoad'; import { delay } from '../../../utils/helpers'; import { NewThread } from './NewThread'; -import { getBaseApi } from '../../../background'; import { decryptPublishes, getTempPublish, @@ -55,15 +54,11 @@ import CheckSVG from '../../../assets/svgs/Check.svg'; import SortSVG from '../../../assets/svgs/Sort.svg'; import ArrowDownSVG from '../../../assets/svgs/ArrowDown.svg'; import { LoadingSnackbar } from '../../Snackbar/LoadingSnackbar'; -import { - executeEvent, - subscribeToEvent, - unsubscribeFromEvent, -} from '../../../utils/events'; +import { executeEvent } from '../../../utils/events'; import RefreshIcon from '@mui/icons-material/Refresh'; import { getArbitraryEndpointReact, getBaseApiReact } from '../../../App'; -import { WrapperUserAction } from '../../WrapperUserAction'; import { addDataPublishesFunc, getDataPublishesFunc } from '../Group'; + const filterOptions = ['Recently active', 'Newest', 'Oldest']; export const threadIdentifier = 'DOCUMENT'; @@ -183,7 +178,7 @@ export const GroupMail = ({ }); }); } catch (error) { - } finally { + console.log(error); } }; @@ -266,7 +261,6 @@ export const GroupMail = ({ } else { sorted = fullArrayMsg.sort((a: any, b: any) => a.created - b.created); } - setAllThreads(sorted); } catch (error) { console.log({ error }); @@ -376,6 +370,7 @@ export const GroupMail = ({ ); setRecentThreads(sorted); } catch (error) { + console.log(error); } finally { setIsLoading(false); // dispatch(setIsLoadingCustom(null)); @@ -444,7 +439,6 @@ export const GroupMail = ({ } } } - setMembers(members); } catch (error) { console.log({ error }); @@ -754,7 +748,9 @@ export const GroupMail = ({ > {thread?.threadData?.title} + + {filterMode === 'Recently active' && (
Last page diff --git a/src/components/Group/Forum/Mail-styles.ts b/src/components/Group/Forum/Mail-styles.ts index 534304d..368e4cb 100644 --- a/src/components/Group/Forum/Mail-styles.ts +++ b/src/components/Group/Forum/Mail-styles.ts @@ -1,52 +1,47 @@ -import { - AppBar, - Button, - Toolbar, - Typography, - Box, - TextField, -} from "@mui/material"; -import { styled } from "@mui/system"; +import { Typography, Box, TextField } from '@mui/material'; +import { styled } from '@mui/system'; export const InstanceContainer = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - width: "100%", - backgroundColor: "var(--color-instance)", - height: "59px", + display: 'flex', + alignItems: 'center', + width: '100%', + backgroundColor: 'var(--color-instance)', + height: '59px', flexShrink: 0, - justifyContent: "space-between", + justifyContent: 'space-between', })); + export const MailContainer = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - width: "100%", - height: "calc(100vh - 78px)", - overflow: "hidden", + display: 'flex', + flexDirection: 'column', + width: '100%', + height: 'calc(100vh - 78px)', + overflow: 'hidden', })); export const MailBody = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "row", - width: "100%", - height: "calc(100% - 59px)", - // overflow: 'auto !important' + display: 'flex', + flexDirection: 'row', + width: '100%', + height: 'calc(100% - 59px)', })); + export const MailBodyInner = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - width: "50%", - height: "100%", + display: 'flex', + flexDirection: 'column', + width: '50%', + height: '100%', })); + export const MailBodyInnerHeader = styled(Box)(({ theme }) => ({ - display: "flex", - width: "100%", - height: "25px", - marginTop: "50px", - marginBottom: "35px", - justifyContent: "center", - alignItems: "center", - gap: "11px", + display: 'flex', + width: '100%', + height: '25px', + marginTop: '50px', + marginBottom: '35px', + justifyContent: 'center', + alignItems: 'center', + gap: '11px', })); export const MailBodyInnerScroll = styled(Box)` @@ -84,163 +79,174 @@ export const MailBodyInnerScroll = styled(Box)` `; export const ComposeContainer = styled(Box)(({ theme }) => ({ - display: "flex", - width: "150px", - alignItems: "center", - gap: "7px", - height: "100%", - cursor: "pointer", - transition: "0.2s background-color", - justifyContent: "center", - "&:hover": { - backgroundColor: "rgba(67, 68, 72, 1)", + display: 'flex', + width: '150px', + alignItems: 'center', + gap: '7px', + height: '100%', + cursor: 'pointer', + transition: '0.2s background-color', + justifyContent: 'center', + '&:hover': { + backgroundColor: 'rgba(67, 68, 72, 1)', }, })); + export const ComposeContainerBlank = styled(Box)(({ theme }) => ({ - display: "flex", - width: "150px", - alignItems: "center", - gap: "7px", - height: "100%", + display: 'flex', + width: '150px', + alignItems: 'center', + gap: '7px', + height: '100%', })); + export const ComposeP = styled(Typography)(({ theme }) => ({ - fontSize: "15px", + fontSize: '15px', fontWeight: 500, })); -export const ComposeIcon = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", - cursor: "pointer", -}); -export const ArrowDownIcon = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", - cursor: "pointer", -}); -export const MailIconImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", +export const ComposeIcon = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', + cursor: 'pointer', }); -export const MailMessageRowInfoImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", +export const ArrowDownIcon = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', + cursor: 'pointer', +}); + +export const MailIconImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', +}); + +export const MailMessageRowInfoImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', }); export const SelectInstanceContainer = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - gap: "17px", + display: 'flex', + alignItems: 'center', + gap: '17px', })); + export const SelectInstanceContainerInner = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - gap: "3px", - cursor: "pointer", - padding: "8px", - transition: "all 0.2s", - "&:hover": { - borderRadius: "8px", - background: "#434448", + display: 'flex', + alignItems: 'center', + gap: '3px', + cursor: 'pointer', + padding: '8px', + transition: 'all 0.2s', + '&:hover': { + borderRadius: '8px', + background: '#434448', }, })); + export const SelectInstanceContainerFilterInner = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - gap: "3px", - cursor: "pointer", - padding: "8px", - transition: "all 0.2s" + display: 'flex', + alignItems: 'center', + gap: '3px', + cursor: 'pointer', + padding: '8px', + transition: 'all 0.2s', })); - export const InstanceLabel = styled(Typography)(({ theme }) => ({ - fontSize: "16px", + fontSize: '16px', fontWeight: 500, - color: "#FFFFFF33", + color: '#FFFFFF33', })); export const InstanceP = styled(Typography)(({ theme }) => ({ - fontSize: "16px", + fontSize: '16px', fontWeight: 500, })); export const MailMessageRowContainer = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - cursor: "pointer", - justifyContent: "space-between", - borderRadius: "56px 5px 10px 56px", - paddingRight: "15px", - transition: "background 0.2s", - gap: "10px", - "&:hover": { - background: "#434448", + display: 'flex', + alignItems: 'center', + cursor: 'pointer', + justifyContent: 'space-between', + borderRadius: '56px 5px 10px 56px', + paddingRight: '15px', + transition: 'background 0.2s', + gap: '10px', + '&:hover': { + background: '#434448', }, })); + export const MailMessageRowProfile = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - cursor: "pointer", - justifyContent: "flex-start", - gap: "10px", - width: "50%", - overflow: "hidden", + display: 'flex', + alignItems: 'center', + cursor: 'pointer', + justifyContent: 'flex-start', + gap: '10px', + width: '50%', + overflow: 'hidden', })); + export const MailMessageRowInfo = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - cursor: "pointer", - justifyContent: "flex-start", - gap: "7px", - width: "50%", + display: 'flex', + alignItems: 'center', + cursor: 'pointer', + justifyContent: 'flex-start', + gap: '7px', + width: '50%', })); + export const MailMessageRowInfoStatusNotDecrypted = styled(Typography)( ({ theme }) => ({ - fontSize: "16px", + fontSize: '16px', fontWeight: 900, - textTransform: "uppercase", - paddingTop: "2px", + textTransform: 'uppercase', + paddingTop: '2px', }) ); + export const MailMessageRowInfoStatusRead = styled(Typography)(({ theme }) => ({ - fontSize: "16px", + fontSize: '16px', fontWeight: 300, })); export const MessageExtraInfo = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - gap: "2px", - overflow: "hidden", + display: 'flex', + flexDirection: 'column', + gap: '2px', + overflow: 'hidden', })); + export const MessageExtraName = styled(Typography)(({ theme }) => ({ - fontSize: "16px", + fontSize: '16px', fontWeight: 900, - whiteSpace: "nowrap", - textOverflow: "ellipsis", - overflow: "hidden", + whiteSpace: 'nowrap', + textOverflow: 'ellipsis', + overflow: 'hidden', })); + export const MessageExtraDate = styled(Typography)(({ theme }) => ({ - fontSize: "15px", + fontSize: '15px', fontWeight: 500, })); export const MessagesContainer = styled(Box)(({ theme }) => ({ - width: "460px", - maxWidth: "90%", - display: "flex", - flexDirection: "column", - gap: "12px", + width: '460px', + maxWidth: '90%', + display: 'flex', + flexDirection: 'column', + gap: '12px', })); export const InstanceListParent = styled(Box)` @@ -254,18 +260,21 @@ export const InstanceListParent = styled(Box)` background-color: var(--color-instance-popover-bg); border: 1px solid rgba(0, 0, 0, 0.1); `; + export const InstanceListHeader = styled(Box)` display: flex; flex-direction: column; width: 100%; background-color: var(--color-instance-popover-bg); `; + export const InstanceFooter = styled(Box)` display: flex; flex-direction: column; width: 100%; flex-shrink: 0; `; + export const InstanceListContainer = styled(Box)` width: 100%; display: flex; @@ -301,126 +310,132 @@ export const InstanceListContainer = styled(Box)` } } `; + export const InstanceListContainerRowLabelContainer = styled(Box)( ({ theme }) => ({ - width: "100%", - display: "flex", - alignItems: "center", - gap: "10px", - height: "50px", + width: '100%', + display: 'flex', + alignItems: 'center', + gap: '10px', + height: '50px', }) ); + export const InstanceListContainerRow = styled(Box)(({ theme }) => ({ - width: "100%", - display: "flex", - alignItems: "center", - gap: "10px", - height: "50px", - cursor: "pointer", - transition: "0.2s background", - "&:hover": { - background: "rgba(67, 68, 72, 1)", + width: '100%', + display: 'flex', + alignItems: 'center', + gap: '10px', + height: '50px', + cursor: 'pointer', + transition: '0.2s background', + '&:hover': { + background: 'rgba(67, 68, 72, 1)', }, flexShrink: 0, })); + export const InstanceListContainerRowCheck = styled(Box)(({ theme }) => ({ - width: "47px", - display: "flex", - alignItems: "center", - justifyContent: "center", + width: '47px', + display: 'flex', + alignItems: 'center', + justifyContent: 'center', })); + export const InstanceListContainerRowMain = styled(Box)(({ theme }) => ({ - display: "flex", - justifyContent: "space-between", - width: "100%", - alignItems: "center", - paddingRight: "30px", - overflow: "hidden", + display: 'flex', + justifyContent: 'space-between', + width: '100%', + alignItems: 'center', + paddingRight: '30px', + overflow: 'hidden', })); + export const CloseParent = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - gap: "20px", + display: 'flex', + alignItems: 'center', + gap: '20px', })); + export const InstanceListContainerRowMainP = styled(Typography)( ({ theme }) => ({ fontWeight: 500, - fontSize: "16px", - textOverflow: "ellipsis", - overflow: "hidden", + fontSize: '16px', + textOverflow: 'ellipsis', + overflow: 'hidden', }) ); -export const InstanceListContainerRowCheckIcon = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", +export const InstanceListContainerRowCheckIcon = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', }); -export const InstanceListContainerRowGroupIcon = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", +export const InstanceListContainerRowGroupIcon = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', }); export const TypeInAliasTextfield = styled(TextField)({ - width: "340px", // Adjust the width as needed - borderRadius: "5px", - backgroundColor: "rgba(30, 30, 32, 1)", - border: "none", - outline: "none", + width: '340px', // Adjust the width as needed + borderRadius: '5px', + backgroundColor: 'rgba(30, 30, 32, 1)', + border: 'none', + outline: 'none', input: { fontSize: 16, - color: "white", - "&::placeholder": { + color: 'white', + '&::placeholder': { fontSize: 16, - color: "rgba(255, 255, 255, 0.2)", + color: 'rgba(255, 255, 255, 0.2)', }, - border: "none", - outline: "none", - padding: "10px", + border: 'none', + outline: 'none', + padding: '10px', }, - "& .MuiOutlinedInput-root": { - "& fieldset": { - border: "none", + '& .MuiOutlinedInput-root': { + '& fieldset': { + border: 'none', }, - "&:hover fieldset": { - border: "none", + '&:hover fieldset': { + border: 'none', }, - "&.Mui-focused fieldset": { - border: "none", + '&.Mui-focused fieldset': { + border: 'none', }, }, - "& .MuiInput-underline:before": { - borderBottom: "none", + '& .MuiInput-underline:before': { + borderBottom: 'none', }, - "& .MuiInput-underline:hover:not(.Mui-disabled):before": { - borderBottom: "none", + '& .MuiInput-underline:hover:not(.Mui-disabled):before': { + borderBottom: 'none', }, - "& .MuiInput-underline:after": { - borderBottom: "none", + '& .MuiInput-underline:after': { + borderBottom: 'none', }, }); -export const NewMessageCloseImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", - cursor: "pointer", +export const NewMessageCloseImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', + cursor: 'pointer', }); export const NewMessageHeaderP = styled(Typography)(({ theme }) => ({ - fontSize: "18px", + fontSize: '18px', fontWeight: 600, })); export const NewMessageInputRow = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - justifyContent: "space-between", - borderBottom: "3px solid rgba(237, 239, 241, 1)", - width: "100%", - paddingBottom: "6px", + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + borderBottom: '3px solid rgba(237, 239, 241, 1)', + width: '100%', + paddingBottom: '6px', })); export const NewMessageInputLabelP = styled(Typography)` color: rgba(84, 84, 84, 0.7); @@ -444,25 +459,25 @@ export const AliasLabelP = styled(Typography)` } `; export const NewMessageAliasContainer = styled(Box)(({ theme }) => ({ - display: "flex", - alignItems: "center", - gap: "12px", + display: 'flex', + alignItems: 'center', + gap: '12px', })); export const AttachmentContainer = styled(Box)(({ theme }) => ({ - height: "36px", - width: "100%", - display: "flex", - alignItems: "center", + height: '36px', + width: '100%', + display: 'flex', + alignItems: 'center', })); -export const NewMessageAttachmentImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", - cursor: "pointer", - padding: "10px", - border: "1px dashed #646464", +export const NewMessageAttachmentImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', + cursor: 'pointer', + padding: '10px', + border: '1px dashed #646464', }); export const NewMessageSendButton = styled(Box)` @@ -582,34 +597,36 @@ export const ShowMessageButtonP = styled(Typography)` color: white; `; -export const ShowMessageButtonImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", - cursor: "pointer", +export const ShowMessageButtonImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', + cursor: 'pointer', }); -export const MailAttachmentImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", +export const MailAttachmentImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', }); -export const AliasAvatarImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", + +export const AliasAvatarImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', }); -export const MoreImg = styled("img")({ - width: "auto", - height: "auto", - userSelect: "none", - objectFit: "contain", - transition: "0.2s all", - "&:hover": { - transform: "scale(1.3)", + +export const MoreImg = styled('img')({ + width: 'auto', + height: 'auto', + userSelect: 'none', + objectFit: 'contain', + transition: '0.2s all', + '&:hover': { + transform: 'scale(1.3)', }, }); @@ -625,17 +642,19 @@ export const MoreP = styled(Typography)` letter-spacing: -0.16px; white-space: nowrap; `; + export const ThreadContainerFullWidth = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - width: "100%", - alignItems: "center", + display: 'flex', + flexDirection: 'column', + width: '100%', + alignItems: 'center', })); + export const ThreadContainer = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - width: "100%", - maxWidth: "95%", + display: 'flex', + flexDirection: 'column', + width: '100%', + maxWidth: '95%', })); export const GroupNameP = styled(Typography)` @@ -648,130 +667,131 @@ export const GroupNameP = styled(Typography)` `; export const AllThreadP = styled(Typography)` - color: #FFF; -font-size: 20px; -font-style: normal; -font-weight: 400; -line-height: 120%; /* 24px */ -letter-spacing: 0.15px; + color: #fff; + font-size: 20px; + font-style: normal; + font-weight: 400; + line-height: 120%; /* 24px */ + letter-spacing: 0.15px; `; export const SingleThreadParent = styled(Box)` -border-radius: 35px 4px 4px 35px; -position: relative; -background: #434448; -display: flex; -padding: 13px; -cursor: pointer; -margin-bottom: 5px; -height: 76px; -align-items:center; -transition: 0.2s all; -&:hover { -background: rgba(255, 255, 255, 0.20) -} + border-radius: 35px 4px 4px 35px; + position: relative; + background: #434448; + display: flex; + padding: 13px; + cursor: pointer; + margin-bottom: 5px; + height: 76px; + align-items: center; + transition: 0.2s all; + &:hover { + background: rgba(255, 255, 255, 0.2); + } `; -export const SingleTheadMessageParent = styled(Box)` -border-radius: 35px 4px 4px 35px; -background: #434448; -display: flex; -padding: 13px; -cursor: pointer; -margin-bottom: 5px; -height: 76px; -align-items:center; +export const SingleTheadMessageParent = styled(Box)` + border-radius: 35px 4px 4px 35px; + background: #434448; + display: flex; + padding: 13px; + cursor: pointer; + margin-bottom: 5px; + height: 76px; + align-items: center; `; export const ThreadInfoColumn = styled(Box)(({ theme }) => ({ - display: "flex", - flexDirection: "column", - width: "170px", + display: 'flex', + flexDirection: 'column', + width: '170px', gap: '2px', marginLeft: '10px', height: '100%', - justifyContent: 'center' + justifyContent: 'center', })); - export const ThreadInfoColumnNameP = styled(Typography)` -color: #FFF; -font-family: Roboto; -font-size: 16px; -font-style: normal; -font-weight: 900; -line-height: normal; -white-space: nowrap; + color: #fff; + font-family: Roboto; + font-size: 16px; + font-style: normal; + font-weight: 900; + line-height: normal; + white-space: nowrap; text-overflow: ellipsis; overflow: hidden; `; + export const ThreadInfoColumnbyP = styled('span')` -color: rgba(255, 255, 255, 0.80); -font-family: Roboto; -font-size: 16px; -font-style: normal; -font-weight: 500; -line-height: normal; + color: rgba(255, 255, 255, 0.8); + font-family: Roboto; + font-size: 16px; + font-style: normal; + font-weight: 500; + line-height: normal; `; export const ThreadInfoColumnTime = styled(Typography)` -color: rgba(255, 255, 255, 0.80); -font-family: Roboto; -font-size: 15px; -font-style: normal; -font-weight: 500; -line-height: normal; -` + color: rgba(255, 255, 255, 0.8); + font-family: Roboto; + font-size: 15px; + font-style: normal; + font-weight: 500; + line-height: normal; +`; + export const ThreadSingleTitle = styled(Typography)` -color: #FFF; -font-family: Roboto; -font-size: 23px; -font-style: normal; -font-weight: 700; -line-height: normal; -white-space: wrap; + color: #fff; + font-family: Roboto; + font-size: 23px; + font-style: normal; + font-weight: 700; + line-height: normal; + white-space: wrap; text-overflow: ellipsis; overflow: hidden; -` +`; + export const ThreadSingleLastMessageP = styled(Typography)` -color: #FFF; -font-family: Roboto; -font-size: 12px; -font-style: normal; -font-weight: 600; -line-height: normal; -` + color: #fff; + font-family: Roboto; + font-size: 12px; + font-style: normal; + font-weight: 600; + line-height: normal; +`; + export const ThreadSingleLastMessageSpanP = styled('span')` -color: #FFF; -font-family: Roboto; -font-size: 12px; -font-style: normal; -font-weight: 400; -line-height: normal; + color: #fff; + font-family: Roboto; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: normal; `; export const GroupContainer = styled(Box)` -position: relative; - overflow: auto; - width: 100%; - - -` + position: relative; + overflow: auto; + width: 100%; +`; export const CloseContainer = styled(Box)(({ theme }) => ({ - display: "flex", - width: "50px", - overflow: "hidden", - alignItems: "center", - cursor: "pointer", - transition: "0.2s background-color", - justifyContent: "center", + display: 'flex', + width: '50px', + overflow: 'hidden', + alignItems: 'center', + cursor: 'pointer', + transition: '0.2s background-color', + justifyContent: 'center', position: 'absolute', top: '0px', right: '0px', height: '50px', borderRadius: '0px 12px 0px 0px', - "&:hover": { - backgroundColor: "rgba(162, 31, 31, 1)", + '&:hover': { + backgroundColor: 'rgba(162, 31, 31, 1)', }, -})); \ No newline at end of file +})); diff --git a/src/components/Group/Forum/NewThread.tsx b/src/components/Group/Forum/NewThread.tsx index dc987d9..d5c4384 100644 --- a/src/components/Group/Forum/NewThread.tsx +++ b/src/components/Group/Forum/NewThread.tsx @@ -191,7 +191,7 @@ export const NewThread = ({ } if (!groupInfo) { errorMsg = 'Cannot access group information'; - } + } // TODO translate // if (!description) missingFields.push('subject') if (missingFields.length > 0) { diff --git a/src/components/Group/Forum/ReadOnlySlate.tsx b/src/components/Group/Forum/ReadOnlySlate.tsx index d64cf9e..5724f92 100644 --- a/src/components/Group/Forum/ReadOnlySlate.tsx +++ b/src/components/Group/Forum/ReadOnlySlate.tsx @@ -1,18 +1,24 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; -import { createEditor} from 'slate'; -import { withReact, Slate, Editable, RenderElementProps, RenderLeafProps } from 'slate-react'; +import { createEditor } from 'slate'; +import { + withReact, + Slate, + Editable, + RenderElementProps, + RenderLeafProps, +} from 'slate-react'; -type ExtendedRenderElementProps = RenderElementProps & { mode?: string } +type ExtendedRenderElementProps = RenderElementProps & { mode?: string }; export const renderElement = ({ attributes, children, element, - mode + mode, }: ExtendedRenderElementProps) => { switch (element.type) { case 'block-quote': - return
{children}
+ return
{children}
; case 'heading-2': return (

{children}

- ) + ); case 'heading-3': return (

{children}

- ) + ); case 'code-block': return (
           {children}
         
- ) + ); case 'code-line': - return
{children}
+ return
{children}
; case 'link': return ( {children} - ) + ); default: return (

{children}

- ) + ); } -} - +}; export const renderLeaf = ({ attributes, children, leaf }: RenderLeafProps) => { - let el = children + let el = children; if (leaf.bold) { - el = {el} + el = {el}; } if (leaf.italic) { - el = {el} + el = {el}; } if (leaf.underline) { - el = {el} + el = {el}; } if (leaf.link) { @@ -81,39 +86,35 @@ export const renderLeaf = ({ attributes, children, leaf }: RenderLeafProps) => { {el} - ) + ); } - return {el} -} + return {el}; +}; interface ReadOnlySlateProps { - content: any - mode?: string + content: any; + mode?: string; } const ReadOnlySlate: React.FC = ({ content, mode }) => { - const [load, setLoad] = useState(false) - const editor = useMemo(() => withReact(createEditor()), []) - const value = useMemo(() => content, [content]) + const [load, setLoad] = useState(false); + const editor = useMemo(() => withReact(createEditor()), []); + const value = useMemo(() => content, [content]); - const performUpdate = useCallback(async()=> { - setLoad(true) - await new Promise((res)=> { + const performUpdate = useCallback(async () => { + setLoad(true); + await new Promise((res) => { setTimeout(() => { - res() + res(); }, 250); - }) - setLoad(false) - }, []) - useEffect(()=> { + }); + setLoad(false); + }, []); + useEffect(() => { + performUpdate(); + }, [value]); - - - - performUpdate() - }, [value]) - - if(load) return null + if (load) return null; return ( {}}> @@ -123,7 +124,7 @@ const ReadOnlySlate: React.FC = ({ content, mode }) => { renderLeaf={renderLeaf} /> - ) -} + ); +}; -export default ReadOnlySlate; \ No newline at end of file +export default ReadOnlySlate; diff --git a/src/components/Group/Forum/ShowMessageWithoutModal.tsx b/src/components/Group/Forum/ShowMessageWithoutModal.tsx index 9a079d6..7a4e594 100644 --- a/src/components/Group/Forum/ShowMessageWithoutModal.tsx +++ b/src/components/Group/Forum/ShowMessageWithoutModal.tsx @@ -1,8 +1,8 @@ -import React, { useState } from "react"; -import { Avatar, Box, IconButton } from "@mui/material"; -import DOMPurify from "dompurify"; +import { useState } from 'react'; +import { Avatar, Box, IconButton } from '@mui/material'; +import DOMPurify from 'dompurify'; import FormatQuoteIcon from '@mui/icons-material/FormatQuote'; -import MoreSVG from '../../../assets/svgs/More.svg' +import MoreSVG from '../../../assets/svgs/More.svg'; import { MoreImg, @@ -11,20 +11,18 @@ import { ThreadInfoColumn, ThreadInfoColumnNameP, ThreadInfoColumnTime, -} from "./Mail-styles"; -import { Spacer } from "../../../common/Spacer"; -import { DisplayHtml } from "./DisplayHtml"; -import { formatTimestampForum } from "../../../utils/time"; -import ReadOnlySlate from "./ReadOnlySlate"; -import { MessageDisplay } from "../../Chat/MessageDisplay"; -import { getBaseApi } from "../../../background"; -import { getBaseApiReact } from "../../../App"; -import { WrapperUserAction } from "../../WrapperUserAction"; +} from './Mail-styles'; +import { Spacer } from '../../../common/Spacer'; +import { formatTimestampForum } from '../../../utils/time'; +import ReadOnlySlate from './ReadOnlySlate'; +import { MessageDisplay } from '../../Chat/MessageDisplay'; +import { getBaseApiReact } from '../../../App'; +import { WrapperUserAction } from '../../WrapperUserAction'; export const ShowMessage = ({ message, openNewPostWithQuote, myName }: any) => { const [expandAttachments, setExpandAttachments] = useState(false); - let cleanHTML = ""; + let cleanHTML = ''; if (message?.htmlContent) { cleanHTML = DOMPurify.sanitize(message.htmlContent); } @@ -32,79 +30,94 @@ export const ShowMessage = ({ message, openNewPostWithQuote, myName }: any) => { return ( - - {message?.name?.charAt(0)} - + + + {message?.name?.charAt(0)} + + - - - {message?.name} + + {message?.name} {formatTimestampForum(message?.created)}
- {message?.attachments?.length > 0 && ( - - {message?.attachments - .map((file: any, index: number) => { - const isFirst = index === 0 - return ( - + {message?.attachments?.length > 0 && ( + + {message?.attachments.map((file: any, index: number) => { + const isFirst = index === 0; + return ( - {/* + {/* { {file?.originalFilename || file?.filename} */} - {message?.attachments?.length > 1 && isFirst && ( - { - setExpandAttachments(prev => !prev); - }} - > - 1 && isFirst && ( + - - {expandAttachments ? 'hide' : `(${message?.attachments?.length - 1} more)`} - - - - )} + onClick={() => { + setExpandAttachments((prev) => !prev); + }} + > + + + {expandAttachments + ? 'hide' + : `(${message?.attachments?.length - 1} more)`} + + + )} + - - ); - }) - } - - )} - -
+ ); + })} +
+ )} +
+ + {message?.reply?.textContentV2 && ( <> - + - - {message?.reply?.name?.charAt(0)} - - {message?.reply?.name} - - - - - - + sx={{ + display: 'flex', + alignItems: 'flex-start', + gap: '10px', + }} + > + + {message?.reply?.name?.charAt(0)} + + + + {message?.reply?.name} + + + + + + - )} - + {message?.textContent && ( )} @@ -208,22 +230,18 @@ export const ShowMessage = ({ message, openNewPostWithQuote, myName }: any) => { {message?.htmlContent && (
)} - - openNewPostWithQuote(message)} - + - - + openNewPostWithQuote(message)}> + + - - - ); }; diff --git a/src/components/Group/Forum/TextEditor.tsx b/src/components/Group/Forum/TextEditor.tsx index 874f2e3..ac26275 100644 --- a/src/components/Group/Forum/TextEditor.tsx +++ b/src/components/Group/Forum/TextEditor.tsx @@ -1,32 +1,33 @@ -import React from "react"; -import ReactQuill, { Quill } from "react-quill"; -import "react-quill/dist/quill.snow.css"; -import ImageResize from "quill-image-resize-module-react"; -import './texteditor.css' -Quill.register("modules/imageResize", ImageResize); +import ReactQuill, { Quill } from 'react-quill'; +import 'react-quill/dist/quill.snow.css'; +import ImageResize from 'quill-image-resize-module-react'; +import './texteditor.css'; + +Quill.register('modules/imageResize', ImageResize); const modules = { imageResize: { - parchment: Quill.import("parchment"), - modules: ["Resize", "DisplaySize"], + parchment: Quill.import('parchment'), + modules: ['Resize', 'DisplaySize'], }, toolbar: [ - ["bold", "italic", "underline", "strike"], // styled text - ["blockquote", "code-block"], // blocks + ['bold', 'italic', 'underline', 'strike'], // styled text + ['blockquote', 'code-block'], // blocks [{ header: 1 }, { header: 2 }], // custom button values - [{ list: "ordered" }, { list: "bullet" }], // lists - [{ script: "sub" }, { script: "super" }], // superscript/subscript - [{ indent: "-1" }, { indent: "+1" }], // outdent/indent - [{ direction: "rtl" }], // text direction - [{ size: ["small", false, "large", "huge"] }], // custom dropdown + [{ list: 'ordered' }, { list: 'bullet' }], // lists + [{ script: 'sub' }, { script: 'super' }], // superscript/subscript + [{ indent: '-1' }, { indent: '+1' }], // outdent/indent + [{ direction: 'rtl' }], // text direction + [{ size: ['small', false, 'large', 'huge'] }], // custom dropdown [{ header: [1, 2, 3, 4, 5, 6, false] }], // custom button values [{ color: [] }, { background: [] }], // dropdown with defaults [{ font: [] }], // font family [{ align: [] }], // text align - ["clean"], // remove formatting + ['clean'], // remove formatting // ["image"], // image ], }; + export const TextEditor = ({ inlineContent, setInlineContent }: any) => { return ( Previous diff --git a/src/components/Group/Group.tsx b/src/components/Group/Group.tsx index 4573022..a4629ce 100644 --- a/src/components/Group/Group.tsx +++ b/src/components/Group/Group.tsx @@ -2218,7 +2218,8 @@ export const Group = ({ }} > No group selected - + {' '} + // TODO translate )} @@ -2235,39 +2236,39 @@ export const Group = ({ : '0px', }} > - - + - + + /> { Group Invites{' '} {groupsWithJoinRequests?.length > 0 && diff --git a/src/components/Group/GroupJoinRequests.tsx b/src/components/Group/GroupJoinRequests.tsx index 1847bd0..4bc6b21 100644 --- a/src/components/Group/GroupJoinRequests.tsx +++ b/src/components/Group/GroupJoinRequests.tsx @@ -82,6 +82,7 @@ export const GroupJoinRequests = ({ ); setGroupsWithJoinRequests(res); } catch (error) { + console.log(error); } finally { setLoading(false); } @@ -138,7 +139,7 @@ export const GroupJoinRequests = ({ Join Requests{' '} {filteredJoinRequests?.filter((group) => group?.data?.length > 0) diff --git a/src/components/Group/GroupMenu.tsx b/src/components/Group/GroupMenu.tsx index a44c480..0d81cd2 100644 --- a/src/components/Group/GroupMenu.tsx +++ b/src/components/Group/GroupMenu.tsx @@ -1,22 +1,27 @@ -import React, { useState } from "react"; +import { useState } from 'react'; import { Button, Menu, MenuItem, ListItemIcon, ListItemText, - Badge, Box, -} from "@mui/material"; -import ForumIcon from "@mui/icons-material/Forum"; -import GroupIcon from "@mui/icons-material/Group"; -import { ArrowDownIcon } from "../../assets/Icons/ArrowDownIcon"; -import { NotificationIcon2 } from "../../assets/Icons/NotificationIcon2"; -import { ChatIcon } from "../../assets/Icons/ChatIcon"; -import { ThreadsIcon } from "../../assets/Icons/ThreadsIcon"; -import { MembersIcon } from "../../assets/Icons/MembersIcon"; +} from '@mui/material'; +import { ArrowDownIcon } from '../../assets/Icons/ArrowDownIcon'; +import { NotificationIcon2 } from '../../assets/Icons/NotificationIcon2'; +import { ChatIcon } from '../../assets/Icons/ChatIcon'; +import { ThreadsIcon } from '../../assets/Icons/ThreadsIcon'; +import { MembersIcon } from '../../assets/Icons/MembersIcon'; -export const GroupMenu = ({ setGroupSection, groupSection, setOpenManageMembers, goToAnnouncements, goToChat, hasUnreadChat, hasUnreadAnnouncements }) => { +export const GroupMenu = ({ + setGroupSection, + groupSection, + setOpenManageMembers, + goToAnnouncements, + goToChat, + hasUnreadChat, + hasUnreadAnnouncements, +}) => { const [anchorEl, setAnchorEl] = useState(null); const open = Boolean(anchorEl); @@ -31,170 +36,217 @@ export const GroupMenu = ({ setGroupSection, groupSection, setOpenManageMembers, return ( + { - goToChat() + goToChat(); handleClose(); }} > - - + + - + { - goToAnnouncements() + goToAnnouncements(); handleClose(); }} > - - + + - + { - setGroupSection("forum"); + setGroupSection('forum'); handleClose(); }} > - - - + + - + { - setOpenManageMembers(true) + setOpenManageMembers(true); handleClose(); }} > - - - + + - + diff --git a/src/components/Group/InviteMember.tsx b/src/components/Group/InviteMember.tsx index 40b44ac..de3dc20 100644 --- a/src/components/Group/InviteMember.tsx +++ b/src/components/Group/InviteMember.tsx @@ -1,13 +1,6 @@ import { LoadingButton } from '@mui/lab'; -import { - Box, - Button, - Input, - MenuItem, - Select, - SelectChangeEvent, -} from '@mui/material'; -import React, { useState } from 'react'; +import { Box, Input, MenuItem, Select, SelectChangeEvent } from '@mui/material'; +import { useState } from 'react'; import { Spacer } from '../../common/Spacer'; import { Label } from './AddGroup'; import { getFee } from '../../background'; @@ -34,6 +27,7 @@ export const InviteMember = ({ groupId, setInfoSnack, setOpenSnack, show }) => { }) .then((response) => { if (!response?.error) { + // TODO translate setInfoSnack({ type: 'success', message: `Successfully invited ${value}. It may take a couple of minutes for the changes to propagate`, diff --git a/src/components/Group/ListOfBans.tsx b/src/components/Group/ListOfBans.tsx index db4c6ba..850ce13 100644 --- a/src/components/Group/ListOfBans.tsx +++ b/src/components/Group/ListOfBans.tsx @@ -1,16 +1,31 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { Avatar, Box, Button, ListItem, ListItemAvatar, ListItemButton, ListItemText, Popover } from '@mui/material'; -import { AutoSizer, CellMeasurer, CellMeasurerCache, List } from 'react-virtualized'; +import { useEffect, useRef, useState } from 'react'; +import { + Avatar, + Box, + ListItem, + ListItemAvatar, + ListItemButton, + ListItemText, + Popover, +} from '@mui/material'; +import { + AutoSizer, + CellMeasurer, + CellMeasurerCache, + List, +} from 'react-virtualized'; import { getNameInfo } from './Group'; -import { getBaseApi, getFee } from '../../background'; +import { getFee } from '../../background'; import { LoadingButton } from '@mui/lab'; import { getBaseApiReact } from '../../App'; export const getMemberInvites = async (groupNumber) => { - const response = await fetch(`${getBaseApiReact()}/groups/bans/${groupNumber}?limit=0`); + const response = await fetch( + `${getBaseApiReact()}/groups/bans/${groupNumber}?limit=0` + ); const groupData = await response.json(); return groupData; -} +}; const getNames = async (listOfMembers, includeNoNames) => { let members = []; @@ -20,14 +35,14 @@ const getNames = async (listOfMembers, includeNoNames) => { const name = await getNameInfo(member.offender); if (name) { members.push({ ...member, name }); - } else if(includeNoNames){ - members.push({ ...member, name: name || "" }); + } else if (includeNoNames) { + members.push({ ...member, name: name || '' }); } } } } return members; -} +}; const cache = new CellMeasurerCache({ fixedWidth: true, @@ -49,7 +64,7 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => { } catch (error) { console.error(error); } - } + }; useEffect(() => { if (groupId) { @@ -67,33 +82,36 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => { setOpenPopoverIndex(null); }; - const handleCancelBan = async (address)=> { + const handleCancelBan = async (address) => { try { - const fee = await getFee('CANCEL_GROUP_BAN') + // TODO translate + const fee = await getFee('CANCEL_GROUP_BAN'); await show({ - message: "Would you like to perform a CANCEL_GROUP_BAN transaction?" , - publishFee: fee.fee + ' QORT' - }) - setIsLoadingUnban(true) - new Promise((res, rej)=> { - window.sendMessage("cancelBan", { - groupId, - qortalAddress: address, - }) + message: 'Would you like to perform a CANCEL_GROUP_BAN transaction?', + publishFee: fee.fee + ' QORT', + }); + setIsLoadingUnban(true); + new Promise((res, rej) => { + window + .sendMessage('cancelBan', { + groupId, + qortalAddress: address, + }) .then((response) => { if (!response?.error) { res(response); setIsLoadingUnban(false); setInfoSnack({ - type: "success", - message: "Successfully unbanned user. It may take a couple of minutes for the changes to propagate", + type: 'success', + message: + 'Successfully unbanned user. It may take a couple of minutes for the changes to propagate', }); handlePopoverClose(); setOpenSnack(true); return; } setInfoSnack({ - type: "error", + type: 'error', message: response?.error, }); setOpenSnack(true); @@ -101,24 +119,22 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => { }) .catch((error) => { setInfoSnack({ - type: "error", - message: error.message || "An error occurred", + type: 'error', + message: error.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); - - }) + }); } catch (error) { - } finally { - setIsLoadingUnban(false) + setIsLoadingUnban(false); } - } + }; const rowRenderer = ({ index, key, parent, style }) => { const member = bans[index]; - + return ( { anchorEl={popoverAnchor} onClose={handlePopoverClose} anchorOrigin={{ - vertical: "bottom", - horizontal: "center", + vertical: 'bottom', + horizontal: 'center', }} transformOrigin={{ - vertical: "top", - horizontal: "center", + vertical: 'top', + horizontal: 'center', }} - style={{ marginTop: "8px" }} + style={{ marginTop: '8px' }} > - - handleCancelBan(member?.offender)}>Cancel Ban + variant="contained" + onClick={() => handleCancelBan(member?.offender)} + > + Cancel Ban + - handlePopoverOpen(event, index)}> + handlePopoverOpen(event, index)} + > @@ -179,7 +206,16 @@ export const ListOfBans = ({ groupId, setInfoSnack, setOpenSnack, show }) => { return (

Ban list

-
+
{({ height, width }) => ( {
); -} +}; diff --git a/src/components/Group/ListOfGroupPromotions.tsx b/src/components/Group/ListOfGroupPromotions.tsx index 9a8c170..35ac442 100644 --- a/src/components/Group/ListOfGroupPromotions.tsx +++ b/src/components/Group/ListOfGroupPromotions.tsx @@ -230,7 +230,7 @@ export const ListOfGroupPromotions = () => { .catch((error) => { rej(error.message || 'An error occurred'); }); - }); + }); // TODO translate setInfoSnack({ type: 'success', message: diff --git a/src/components/Group/ListOfInvites.tsx b/src/components/Group/ListOfInvites.tsx index a41bc47..a571775 100644 --- a/src/components/Group/ListOfInvites.tsx +++ b/src/components/Group/ListOfInvites.tsx @@ -1,16 +1,31 @@ -import React, { useEffect, useRef, useState } from 'react'; -import { Avatar, Box, Button, ListItem, ListItemAvatar, ListItemButton, ListItemText, Popover } from '@mui/material'; -import { AutoSizer, CellMeasurer, CellMeasurerCache, List } from 'react-virtualized'; +import { useEffect, useRef, useState } from 'react'; +import { + Avatar, + Box, + ListItem, + ListItemAvatar, + ListItemButton, + ListItemText, + Popover, +} from '@mui/material'; +import { + AutoSizer, + CellMeasurer, + CellMeasurerCache, + List, +} from 'react-virtualized'; import { getNameInfo } from './Group'; -import { getBaseApi, getFee } from '../../background'; +import { getFee } from '../../background'; import { LoadingButton } from '@mui/lab'; import { getBaseApiReact } from '../../App'; export const getMemberInvites = async (groupNumber) => { - const response = await fetch(`${getBaseApiReact()}/groups/invites/group/${groupNumber}?limit=0`); + const response = await fetch( + `${getBaseApiReact()}/groups/invites/group/${groupNumber}?limit=0` + ); const groupData = await response.json(); return groupData; -} +}; const getNames = async (listOfMembers, includeNoNames) => { let members = []; @@ -20,21 +35,26 @@ const getNames = async (listOfMembers, includeNoNames) => { const name = await getNameInfo(member.invitee); if (name) { members.push({ ...member, name }); - } else if(includeNoNames){ - members.push({ ...member, name: name || "" }); + } else if (includeNoNames) { + members.push({ ...member, name: name || '' }); } } } } return members; -} +}; const cache = new CellMeasurerCache({ fixedWidth: true, defaultHeight: 50, }); -export const ListOfInvites = ({ groupId, setInfoSnack, setOpenSnack, show }) => { +export const ListOfInvites = ({ + groupId, + setInfoSnack, + setOpenSnack, + show, +}) => { const [invites, setInvites] = useState([]); const [popoverAnchor, setPopoverAnchor] = useState(null); // Track which list item the popover is anchored to const [openPopoverIndex, setOpenPopoverIndex] = useState(null); // Track which list item has the popover open @@ -50,7 +70,7 @@ export const ListOfInvites = ({ groupId, setInfoSnack, setOpenSnack, show }) => } catch (error) { console.error(error); } - } + }; useEffect(() => { if (groupId) { @@ -68,24 +88,27 @@ export const ListOfInvites = ({ groupId, setInfoSnack, setOpenSnack, show }) => setOpenPopoverIndex(null); }; - const handleCancelInvitation = async (address)=> { + const handleCancelInvitation = async (address) => { try { - const fee = await getFee('CANCEL_GROUP_INVITE') + // TODO translate + const fee = await getFee('CANCEL_GROUP_INVITE'); await show({ - message: "Would you like to perform a CANCEL_GROUP_INVITE transaction?" , - publishFee: fee.fee + ' QORT' - }) - setIsLoadingCancelInvite(true) - await new Promise((res, rej)=> { - window.sendMessage("cancelInvitationToGroup", { - groupId, - qortalAddress: address, - }) + message: 'Would you like to perform a CANCEL_GROUP_INVITE transaction?', + publishFee: fee.fee + ' QORT', + }); + setIsLoadingCancelInvite(true); + await new Promise((res, rej) => { + window + .sendMessage('cancelInvitationToGroup', { + groupId, + qortalAddress: address, + }) .then((response) => { if (!response?.error) { setInfoSnack({ - type: "success", - message: "Successfully canceled invitation. It may take a couple of minutes for the changes to propagate", + type: 'success', + message: + 'Successfully canceled invitation. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); handlePopoverClose(); @@ -94,7 +117,7 @@ export const ListOfInvites = ({ groupId, setInfoSnack, setOpenSnack, show }) => return; } setInfoSnack({ - type: "error", + type: 'error', message: response?.error, }); setOpenSnack(true); @@ -102,24 +125,22 @@ export const ListOfInvites = ({ groupId, setInfoSnack, setOpenSnack, show }) => }) .catch((error) => { setInfoSnack({ - type: "error", - message: error.message || "An error occurred", + type: 'error', + message: error.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); - - }) + }); } catch (error) { - } finally { - setIsLoadingCancelInvite(false) + setIsLoadingCancelInvite(false); } - } + }; const rowRenderer = ({ index, key, parent, style }) => { const member = invites[index]; - + return ( anchorEl={popoverAnchor} onClose={handlePopoverClose} anchorOrigin={{ - vertical: "bottom", - horizontal: "center", + vertical: 'bottom', + horizontal: 'center', }} transformOrigin={{ - vertical: "top", - horizontal: "center", + vertical: 'top', + horizontal: 'center', }} - style={{ marginTop: "8px" }} + style={{ marginTop: '8px' }} > - - handleCancelInvitation(member?.invitee)}>Cancel Invitation + variant="contained" + onClick={() => handleCancelInvitation(member?.invitee)} + > + Cancel Invitation + - handlePopoverOpen(event, index)}> + handlePopoverOpen(event, index)} + > @@ -180,7 +212,16 @@ export const ListOfInvites = ({ groupId, setInfoSnack, setOpenSnack, show }) => return (

Invitees list

-
+
{({ height, width }) => (
); -} +}; diff --git a/src/components/Group/ListOfJoinRequests.tsx b/src/components/Group/ListOfJoinRequests.tsx index 0f4bd81..d2bd5ad 100644 --- a/src/components/Group/ListOfJoinRequests.tsx +++ b/src/components/Group/ListOfJoinRequests.tsx @@ -1,16 +1,31 @@ -import React, { useContext, useEffect, useRef, useState } from 'react'; -import { Avatar, Box, Button, ListItem, ListItemAvatar, ListItemButton, ListItemText, Popover } from '@mui/material'; -import { AutoSizer, CellMeasurer, CellMeasurerCache, List } from 'react-virtualized'; +import { useContext, useEffect, useRef, useState } from 'react'; +import { + Avatar, + Box, + ListItem, + ListItemAvatar, + ListItemButton, + ListItemText, + Popover, +} from '@mui/material'; +import { + AutoSizer, + CellMeasurer, + CellMeasurerCache, + List, +} from 'react-virtualized'; import { getNameInfo } from './Group'; import { getBaseApi, getFee } from '../../background'; import { LoadingButton } from '@mui/lab'; import { MyContext, getBaseApiReact } from '../../App'; export const getMemberInvites = async (groupNumber) => { - const response = await fetch(`${getBaseApiReact()}/groups/joinrequests/${groupNumber}?limit=0`); + const response = await fetch( + `${getBaseApiReact()}/groups/joinrequests/${groupNumber}?limit=0` + ); const groupData = await response.json(); return groupData; -} +}; const getNames = async (listOfMembers, includeNoNames) => { let members = []; @@ -19,24 +34,29 @@ const getNames = async (listOfMembers, includeNoNames) => { if (member.joiner) { const name = await getNameInfo(member.joiner); if (name) { - members.push({ ...member, name: name || "" }); - } else if(includeNoNames){ - members.push({ ...member, name: name || "" }); + members.push({ ...member, name: name || '' }); + } else if (includeNoNames) { + members.push({ ...member, name: name || '' }); } } } } return members; -} +}; const cache = new CellMeasurerCache({ fixedWidth: true, defaultHeight: 50, }); -export const ListOfJoinRequests = ({ groupId, setInfoSnack, setOpenSnack, show }) => { +export const ListOfJoinRequests = ({ + groupId, + setInfoSnack, + setOpenSnack, + show, +}) => { const [invites, setInvites] = useState([]); - const {txList, setTxList} = useContext(MyContext) + const { txList, setTxList } = useContext(MyContext); const [popoverAnchor, setPopoverAnchor] = useState(null); // Track which list item the popover is anchored to const [openPopoverIndex, setOpenPopoverIndex] = useState(null); // Track which list item has the popover open @@ -51,7 +71,7 @@ export const ListOfJoinRequests = ({ groupId, setInfoSnack, setOpenSnack, show } } catch (error) { console.error(error); } - } + }; useEffect(() => { if (groupId) { @@ -69,31 +89,33 @@ export const ListOfJoinRequests = ({ groupId, setInfoSnack, setOpenSnack, show } setOpenPopoverIndex(null); }; - const handleAcceptJoinRequest = async (address)=> { + const handleAcceptJoinRequest = async (address) => { try { - const fee = await getFee('GROUP_INVITE') + const fee = await getFee('GROUP_INVITE'); // TODO translate await show({ - message: "Would you like to perform a GROUP_INVITE transaction?" , - publishFee: fee.fee + ' QORT' - }) - setIsLoadingAccept(true) - await new Promise((res, rej)=> { - window.sendMessage("inviteToGroup", { - groupId, - qortalAddress: address, - inviteTime: 10800, - }) + message: 'Would you like to perform a GROUP_INVITE transaction?', + publishFee: fee.fee + ' QORT', + }); + setIsLoadingAccept(true); + await new Promise((res, rej) => { + window + .sendMessage('inviteToGroup', { + groupId, + qortalAddress: address, + inviteTime: 10800, + }) .then((response) => { if (!response?.error) { setIsLoadingAccept(false); setInfoSnack({ - type: "success", - message: "Successfully accepted join request. It may take a couple of minutes for the changes to propagate", + type: 'success', + message: + 'Successfully accepted join request. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); handlePopoverClose(); res(response); - + setTxList((prev) => [ { ...response, @@ -106,12 +128,12 @@ export const ListOfJoinRequests = ({ groupId, setInfoSnack, setOpenSnack, show } }, ...prev, ]); - + return; } - + setInfoSnack({ - type: "error", + type: 'error', message: response?.error, }); setOpenSnack(true); @@ -119,25 +141,28 @@ export const ListOfJoinRequests = ({ groupId, setInfoSnack, setOpenSnack, show } }) .catch((error) => { setInfoSnack({ - type: "error", - message: error?.message || "An error occurred", + type: 'error', + message: error?.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); - - }) + }); } catch (error) { - } finally { - setIsLoadingAccept(false) + setIsLoadingAccept(false); } - } + }; const rowRenderer = ({ index, key, parent, style }) => { const member = invites[index]; - const findJoinRequsetInTxList = txList?.find((tx)=> tx?.groupId === groupId && tx?.qortalAddress === member?.joiner && tx?.type === 'join-request-accept') - if(findJoinRequsetInTxList) return null + const findJoinRequsetInTxList = txList?.find( + (tx) => + tx?.groupId === groupId && + tx?.qortalAddress === member?.joiner && + tx?.type === 'join-request-accept' + ); + if (findJoinRequsetInTxList) return null; return ( - - handleAcceptJoinRequest(member?.joiner)}>Accept + variant="contained" + onClick={() => handleAcceptJoinRequest(member?.joiner)} + > + Accept + - handlePopoverOpen(event, index)}> + handlePopoverOpen(event, index)} + > @@ -198,7 +234,16 @@ export const ListOfJoinRequests = ({ groupId, setInfoSnack, setOpenSnack, show } return (

Join request list

-
+
{({ height, width }) => (
); -} +}; diff --git a/src/components/Group/ListOfMembers.tsx b/src/components/Group/ListOfMembers.tsx index 9910453..0f227f8 100644 --- a/src/components/Group/ListOfMembers.tsx +++ b/src/components/Group/ListOfMembers.tsx @@ -1,29 +1,29 @@ import { Avatar, Box, - Button, ListItem, ListItemAvatar, ListItemButton, ListItemText, Popover, Typography, -} from "@mui/material"; -import React, { useRef, useState } from "react"; +} from '@mui/material'; +import { useRef, useState } from 'react'; import { AutoSizer, CellMeasurer, CellMeasurerCache, List, -} from "react-virtualized"; -import { LoadingButton } from "@mui/lab"; -import { getBaseApi, getFee } from "../../background"; -import { getBaseApiReact } from "../../App"; +} from 'react-virtualized'; +import { LoadingButton } from '@mui/lab'; +import { getFee } from '../../background'; +import { getBaseApiReact } from '../../App'; const cache = new CellMeasurerCache({ fixedWidth: true, defaultHeight: 50, }); + const ListOfMembers = ({ members, groupId, @@ -40,7 +40,6 @@ const ListOfMembers = ({ const [isLoadingMakeAdmin, setIsLoadingMakeAdmin] = useState(false); const [isLoadingRemoveAdmin, setIsLoadingRemoveAdmin] = useState(false); - const listRef = useRef(); const handlePopoverOpen = (event, index) => { @@ -55,23 +54,25 @@ const ListOfMembers = ({ const handleKick = async (address) => { try { - const fee = await getFee("GROUP_KICK"); + const fee = await getFee('GROUP_KICK'); await show({ - message: "Would you like to perform a GROUP_KICK transaction?", - publishFee: fee.fee + " QORT", + message: 'Would you like to perform a GROUP_KICK transaction?', + publishFee: fee.fee + ' QORT', }); setIsLoadingKick(true); new Promise((res, rej) => { - window.sendMessage("kickFromGroup", { - groupId, - qortalAddress: address, - }) + window + .sendMessage('kickFromGroup', { + groupId, + qortalAddress: address, + }) .then((response) => { if (!response?.error) { setInfoSnack({ - type: "success", - message: "Successfully kicked member from group. It may take a couple of minutes for the changes to propagate", + type: 'success', + message: + 'Successfully kicked member from group. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); handlePopoverClose(); @@ -79,7 +80,7 @@ const ListOfMembers = ({ return; } setInfoSnack({ - type: "error", + type: 'error', message: response?.error, }); setOpenSnack(true); @@ -87,38 +88,40 @@ const ListOfMembers = ({ }) .catch((error) => { setInfoSnack({ - type: "error", - message: error.message || "An error occurred", + type: 'error', + message: error.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); - }); } catch (error) { + console.log(error); } finally { setIsLoadingKick(false); } }; const handleBan = async (address) => { try { - const fee = await getFee("GROUP_BAN"); + const fee = await getFee('GROUP_BAN'); // TODO translate await show({ - message: "Would you like to perform a GROUP_BAN transaction?", - publishFee: fee.fee + " QORT", + message: 'Would you like to perform a GROUP_BAN transaction?', + publishFee: fee.fee + ' QORT', }); setIsLoadingBan(true); await new Promise((res, rej) => { - window.sendMessage("banFromGroup", { - groupId, - qortalAddress: address, - rBanTime: 0, - }) + window + .sendMessage('banFromGroup', { + groupId, + qortalAddress: address, + rBanTime: 0, + }) .then((response) => { if (!response?.error) { setInfoSnack({ - type: "success", - message: "Successfully banned member from group. It may take a couple of minutes for the changes to propagate", + type: 'success', + message: + 'Successfully banned member from group. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); handlePopoverClose(); @@ -126,7 +129,7 @@ const ListOfMembers = ({ return; } setInfoSnack({ - type: "error", + type: 'error', message: response?.error, }); setOpenSnack(true); @@ -134,13 +137,12 @@ const ListOfMembers = ({ }) .catch((error) => { setInfoSnack({ - type: "error", - message: error.message || "An error occurred", + type: 'error', + message: error.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); - }); } catch (error) { } finally { @@ -150,22 +152,24 @@ const ListOfMembers = ({ const makeAdmin = async (address) => { try { - const fee = await getFee("ADD_GROUP_ADMIN"); + const fee = await getFee('ADD_GROUP_ADMIN'); await show({ - message: "Would you like to perform a ADD_GROUP_ADMIN transaction?", - publishFee: fee.fee + " QORT", + message: 'Would you like to perform a ADD_GROUP_ADMIN transaction?', + publishFee: fee.fee + ' QORT', }); setIsLoadingMakeAdmin(true); await new Promise((res, rej) => { - window.sendMessage("makeAdmin", { - groupId, - qortalAddress: address, - }) + window + .sendMessage('makeAdmin', { + groupId, + qortalAddress: address, + }) .then((response) => { if (!response?.error) { setInfoSnack({ - type: "success", - message: "Successfully made member an admin. It may take a couple of minutes for the changes to propagate", + type: 'success', + message: + 'Successfully made member an admin. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); handlePopoverClose(); @@ -173,7 +177,7 @@ const ListOfMembers = ({ return; } setInfoSnack({ - type: "error", + type: 'error', message: response?.error, }); setOpenSnack(true); @@ -181,13 +185,12 @@ const ListOfMembers = ({ }) .catch((error) => { setInfoSnack({ - type: "error", - message: error.message || "An error occurred", + type: 'error', + message: error.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); - }); } catch (error) { } finally { @@ -197,22 +200,24 @@ const ListOfMembers = ({ const removeAdmin = async (address) => { try { - const fee = await getFee("REMOVE_GROUP_ADMIN"); + const fee = await getFee('REMOVE_GROUP_ADMIN'); await show({ - message: "Would you like to perform a REMOVE_GROUP_ADMIN transaction?", - publishFee: fee.fee + " QORT", + message: 'Would you like to perform a REMOVE_GROUP_ADMIN transaction?', + publishFee: fee.fee + ' QORT', }); setIsLoadingRemoveAdmin(true); await new Promise((res, rej) => { - window.sendMessage("removeAdmin", { - groupId, - qortalAddress: address, - }) + window + .sendMessage('removeAdmin', { + groupId, + qortalAddress: address, + }) .then((response) => { if (!response?.error) { setInfoSnack({ - type: "success", - message: "Successfully removed member as an admin. It may take a couple of minutes for the changes to propagate", + type: 'success', + message: + 'Successfully removed member as an admin. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); handlePopoverClose(); @@ -220,7 +225,7 @@ const ListOfMembers = ({ return; } setInfoSnack({ - type: "error", + type: 'error', message: response?.error, }); setOpenSnack(true); @@ -228,13 +233,12 @@ const ListOfMembers = ({ }) .catch((error) => { setInfoSnack({ - type: "error", - message: error.message || "An error occurred", + type: 'error', + message: error.message || 'An error occurred', }); setOpenSnack(true); rej(error); }); - }); } catch (error) { } finally { @@ -260,24 +264,24 @@ const ListOfMembers = ({ anchorEl={popoverAnchor} onClose={handlePopoverClose} anchorOrigin={{ - vertical: "bottom", - horizontal: "center", + vertical: 'bottom', + horizontal: 'center', }} transformOrigin={{ - vertical: "top", - horizontal: "center", + vertical: 'top', + horizontal: 'center', }} - style={{ marginTop: "8px" }} + style={{ marginTop: '8px' }} > {isOwner && ( @@ -336,21 +340,28 @@ const ListOfMembers = ({ {member?.isAdmin && ( - Admin - )} + + Admin + + )} -
)} @@ -363,11 +374,11 @@ const ListOfMembers = ({

Member list

diff --git a/src/components/Group/ListOfThreadPostsWatched.tsx b/src/components/Group/ListOfThreadPostsWatched.tsx index e0a9d00..1cf0d2a 100644 --- a/src/components/Group/ListOfThreadPostsWatched.tsx +++ b/src/components/Group/ListOfThreadPostsWatched.tsx @@ -42,7 +42,7 @@ export const ListOfThreadPostsWatched = () => { rej(response.error); }) .catch((error) => { - rej(error.message || 'An error occurred'); + rej(error.message || 'An error occurred'); // TODO translate }); }); } catch (error) { diff --git a/src/components/Group/ManageMembers.tsx b/src/components/Group/ManageMembers.tsx index a69dde4..05d30aa 100644 --- a/src/components/Group/ManageMembers.tsx +++ b/src/components/Group/ManageMembers.tsx @@ -105,7 +105,7 @@ export const ManageMembers = ({ rej(response.error); }) .catch((error) => { - rej(error.message || 'An error occurred'); + rej(error.message || 'An error occurred'); // TODO translate }); }); } catch (error) { diff --git a/src/components/Group/QMailMessages.tsx b/src/components/Group/QMailMessages.tsx index 857b0db..8673110 100644 --- a/src/components/Group/QMailMessages.tsx +++ b/src/components/Group/QMailMessages.tsx @@ -87,7 +87,7 @@ export const QMailMessages = ({ userName, userAddress }) => { rej(response.error); }) .catch((error) => { - rej(error.message || 'An error occurred'); + rej(error.message || 'An error occurred'); // TODO translate }); }); } catch (error) { diff --git a/src/components/Group/Settings.tsx b/src/components/Group/Settings.tsx index d3ff1f7..fd2f9c2 100644 --- a/src/components/Group/Settings.tsx +++ b/src/components/Group/Settings.tsx @@ -79,7 +79,7 @@ export const Settings = ({ address, open, setOpen }) => { if (response?.error) { console.error('Error adding user settings:', response.error); } else { - console.log('User settings added successfully'); + console.log('User settings added successfully'); // TODO translate } }) .catch((error) => { diff --git a/src/components/Group/UserListOfInvites.tsx b/src/components/Group/UserListOfInvites.tsx index 2a63896..58efd9a 100644 --- a/src/components/Group/UserListOfInvites.tsx +++ b/src/components/Group/UserListOfInvites.tsx @@ -1,240 +1,266 @@ -import { Box, Button, ListItem, ListItemButton, ListItemText, Popover, Typography } from '@mui/material'; -import React, { useContext, useEffect, useRef, useState } from 'react' -import { AutoSizer, CellMeasurer, CellMeasurerCache, List } from 'react-virtualized'; +import { + Box, + ListItem, + ListItemButton, + ListItemText, + Popover, + Typography, +} from '@mui/material'; +import { useContext, useEffect, useRef, useState } from 'react'; +import { + AutoSizer, + CellMeasurer, + CellMeasurerCache, + List, +} from 'react-virtualized'; import { MyContext, getBaseApiReact } from '../../App'; import { LoadingButton } from '@mui/lab'; -import { getBaseApi, getFee } from '../../background'; +import { getFee } from '../../background'; import LockIcon from '@mui/icons-material/Lock'; import NoEncryptionGmailerrorredIcon from '@mui/icons-material/NoEncryptionGmailerrorred'; -import { Spacer } from "../../common/Spacer"; +import { Spacer } from '../../common/Spacer'; const cache = new CellMeasurerCache({ - fixedWidth: true, - defaultHeight: 50, - }); + fixedWidth: true, + defaultHeight: 50, +}); - - -const getGroupInfo = async (groupId)=> { +const getGroupInfo = async (groupId) => { const response = await fetch(`${getBaseApiReact()}/groups/` + groupId); const groupData = await response.json(); if (groupData) { - return groupData - } -} - export const getGroupNames = async (listOfGroups) => { - let groups = []; - if (listOfGroups && Array.isArray(listOfGroups)) { - for (const group of listOfGroups) { - - const groupInfo = await getGroupInfo(group.groupId); - if (groupInfo) { - groups.push({ ...group, ...groupInfo }); - - } - } - } - return groups; + return groupData; } - -export const UserListOfInvites = ({myAddress, setInfoSnack, setOpenSnack}) => { - const {txList, setTxList, show} = useContext(MyContext) - const [invites, setInvites] = useState([]); - const [isLoading, setIsLoading] = useState(false); - - const [popoverAnchor, setPopoverAnchor] = useState(null); // Track which list item the popover is anchored to - const [openPopoverIndex, setOpenPopoverIndex] = useState(null); // Track which list item has the popover open - const listRef = useRef(); - - const getRequests = async () => { - try { - const response = await fetch(`${getBaseApiReact()}/groups/invites/${myAddress}/?limit=0`); - const inviteData = await response.json(); - - const resMoreData = await getGroupNames(inviteData) - setInvites(resMoreData); - } catch (error) { - console.error(error); +}; +export const getGroupNames = async (listOfGroups) => { + let groups = []; + if (listOfGroups && Array.isArray(listOfGroups)) { + for (const group of listOfGroups) { + const groupInfo = await getGroupInfo(group.groupId); + if (groupInfo) { + groups.push({ ...group, ...groupInfo }); } } - - useEffect(() => { - - getRequests(); - - }, []); - - const handlePopoverOpen = (event, index) => { - setPopoverAnchor(event.currentTarget); - setOpenPopoverIndex(index); - }; - - const handlePopoverClose = () => { - setPopoverAnchor(null); - setOpenPopoverIndex(null); - }; - - const handleJoinGroup = async (groupId, groupName)=> { - try { - - const fee = await getFee('JOIN_GROUP') - await show({ - message: "Would you like to perform an JOIN_GROUP transaction?" , - publishFee: fee.fee + ' QORT' - }) + } + return groups; +}; - setIsLoading(true); +export const UserListOfInvites = ({ + myAddress, + setInfoSnack, + setOpenSnack, +}) => { + const { txList, setTxList, show } = useContext(MyContext); + const [invites, setInvites] = useState([]); + const [isLoading, setIsLoading] = useState(false); - await new Promise((res, rej)=> { - window.sendMessage("joinGroup", { + const [popoverAnchor, setPopoverAnchor] = useState(null); // Track which list item the popover is anchored to + const [openPopoverIndex, setOpenPopoverIndex] = useState(null); // Track which list item has the popover open + const listRef = useRef(); + + const getRequests = async () => { + try { + const response = await fetch( + `${getBaseApiReact()}/groups/invites/${myAddress}/?limit=0` + ); + const inviteData = await response.json(); + + const resMoreData = await getGroupNames(inviteData); + setInvites(resMoreData); + } catch (error) { + console.error(error); + } + }; + + useEffect(() => { + getRequests(); + }, []); + + const handlePopoverOpen = (event, index) => { + setPopoverAnchor(event.currentTarget); + setOpenPopoverIndex(index); + }; + + const handlePopoverClose = () => { + setPopoverAnchor(null); + setOpenPopoverIndex(null); + }; + + const handleJoinGroup = async (groupId, groupName) => { + try { + const fee = await getFee('JOIN_GROUP'); // TODO translate + await show({ + message: 'Would you like to perform an JOIN_GROUP transaction?', + publishFee: fee.fee + ' QORT', + }); + + setIsLoading(true); + + await new Promise((res, rej) => { + window + .sendMessage('joinGroup', { groupId, }) - .then((response) => { - if (!response?.error) { - setTxList((prev) => [ - { - ...response, - type: 'joined-group', - label: `Joined Group ${groupName}: awaiting confirmation`, - labelDone: `Joined Group ${groupName}: success!`, - done: false, - groupId, - }, - ...prev, - ]); - res(response); - setInfoSnack({ - type: "success", - message: "Successfully requested to join group. It may take a couple of minutes for the changes to propagate", - }); - setOpenSnack(true); - handlePopoverClose(); - return; - } + .then((response) => { + if (!response?.error) { + setTxList((prev) => [ + { + ...response, + type: 'joined-group', + label: `Joined Group ${groupName}: awaiting confirmation`, + labelDone: `Joined Group ${groupName}: success!`, + done: false, + groupId, + }, + ...prev, + ]); + res(response); setInfoSnack({ - type: "error", - message: response?.error, + type: 'success', + message: + 'Successfully requested to join group. It may take a couple of minutes for the changes to propagate', }); setOpenSnack(true); - rej(response.error); - }) - .catch((error) => { - setInfoSnack({ - type: "error", - message: error.message || "An error occurred", - }); - setOpenSnack(true); - rej(error); + handlePopoverClose(); + return; + } + setInfoSnack({ + type: 'error', + message: response?.error, }); - - }) - - } catch (error) { - - } finally { - setIsLoading(false); - - } + setOpenSnack(true); + rej(response.error); + }) + .catch((error) => { + setInfoSnack({ + type: 'error', + message: error.message || 'An error occurred', + }); + setOpenSnack(true); + rej(error); + }); + }); + } catch (error) { + } finally { + setIsLoading(false); } - - const rowRenderer = ({ index, key, parent, style }) => { - const invite = invites[index]; - - return ( - - {({ measure }) => ( -
- - - { + const invite = invites[index]; + + return ( + + {({ measure }) => ( +
+ + + - Join {invite?.groupName} - Join {invite?.groupName} + handleJoinGroup(invite?.groupId, invite?.groupName)}>Join group - - - handlePopoverOpen(event, index)}> + variant="contained" + onClick={() => + handleJoinGroup(invite?.groupId, invite?.groupName) + } + > + Join group + + + + handlePopoverOpen(event, index)} + > {invite?.isOpen === false && ( - + + )} + {invite?.isOpen === true && ( + + )} + + + + +
)} - {invite?.isOpen === true && ( - - )} - - - -
-
- )} -
- ); - }; - - return ( - + ); + }; + + return ( + -

Invite list

-
+

Invite list

+
- - {({ height, width }) => ( - - )} - -
- - ); -} + + {({ height, width }) => ( + + )} + +
+
+ ); +}; diff --git a/src/components/Group/WalletsAppWrapper.tsx b/src/components/Group/WalletsAppWrapper.tsx index c569425..111e216 100644 --- a/src/components/Group/WalletsAppWrapper.tsx +++ b/src/components/Group/WalletsAppWrapper.tsx @@ -88,7 +88,7 @@ export const WalletsAppWrapper = () => { justifyContent: 'space-between', }} > - Q-Wallets + Q-Wallets // TODO translate { const socketRef = useRef(null); // WebSocket reference const timeoutIdRef = useRef(null); // Timeout ID reference const groupSocketTimeoutRef = useRef(null); // Group Socket Timeout reference - const initiateRef = useRef(null) + const initiateRef = useRef(null); const forceCloseWebSocket = () => { if (socketRef.current) { clearTimeout(timeoutIdRef.current); @@ -17,21 +21,20 @@ export const WebSocketActive = ({ myAddress, setIsLoadingGroups }) => { }; const logoutEventFunc = () => { - forceCloseWebSocket() + forceCloseWebSocket(); }; useEffect(() => { - subscribeToEvent("logout-event", logoutEventFunc); + subscribeToEvent('logout-event', logoutEventFunc); return () => { - unsubscribeFromEvent("logout-event", logoutEventFunc); + unsubscribeFromEvent('logout-event', logoutEventFunc); }; }, []); useEffect(() => { if (!myAddress) return; // Only proceed if myAddress is set - const pingHeads = () => { try { if (socketRef.current?.readyState === WebSocket.OPEN) { @@ -53,10 +56,9 @@ export const WebSocketActive = ({ myAddress, setIsLoadingGroups }) => { const currentAddress = myAddress; try { - if(!initiateRef.current) { - setIsLoadingGroups(true) - pauseAllQueues() - + if (!initiateRef.current) { + setIsLoadingGroups(true); + pauseAllQueues(); } const socketLink = `${getBaseApiReactSocket()}/websockets/chat/active/${currentAddress}?encoding=BASE64&haschatreference=false`; socketRef.current = new WebSocket(socketLink); @@ -71,34 +73,46 @@ export const WebSocketActive = ({ myAddress, setIsLoadingGroups }) => { clearTimeout(timeoutIdRef.current); groupSocketTimeoutRef.current = setTimeout(pingHeads, 45000); // Ping every 45 seconds } else { - if(!initiateRef.current) { - setIsLoadingGroups(false) - initiateRef.current = true - resumeAllQueues() - + if (!initiateRef.current) { + setIsLoadingGroups(false); + initiateRef.current = true; + resumeAllQueues(); } const data = JSON.parse(e.data); - const copyGroups = [...(data?.groups || [])] - const findIndex = copyGroups?.findIndex(item => item?.groupId === 0) - if(findIndex !== -1){ + const copyGroups = [...(data?.groups || [])]; + const findIndex = copyGroups?.findIndex( + (item) => item?.groupId === 0 + ); + if (findIndex !== -1) { copyGroups[findIndex] = { ...(copyGroups[findIndex] || {}), - groupId: "0" - } + groupId: '0', + }; } - const filteredGroups = copyGroups - const sortedGroups = filteredGroups.sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0)); - const sortedDirects = (data?.direct || []).filter(item => - item?.name !== 'extension-proxy' && item?.address !== 'QSMMGSgysEuqDCuLw3S4cHrQkBrh3vP3VH' - ).sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0)); + const filteredGroups = copyGroups; + const sortedGroups = filteredGroups.sort( + (a, b) => (b.timestamp || 0) - (a.timestamp || 0) + ); + const sortedDirects = (data?.direct || []) + .filter( + (item) => + item?.name !== 'extension-proxy' && + item?.address !== 'QSMMGSgysEuqDCuLw3S4cHrQkBrh3vP3VH' + ) + .sort((a, b) => (b.timestamp || 0) - (a.timestamp || 0)); - window.sendMessage("handleActiveGroupDataFromSocket", { - groups: sortedGroups, - directs: sortedDirects, - }).catch((error) => { - console.error("Failed to handle active group data from socket:", error.message || "An error occurred"); + window + .sendMessage('handleActiveGroupDataFromSocket', { + groups: sortedGroups, + directs: sortedDirects, + }) + .catch((error) => { + // TODO translate + console.error( + 'Failed to handle active group data from socket:', + error.message || 'An error occurred' + ); }); - } } catch (error) { console.error('Error parsing onmessage data:', error); @@ -127,9 +141,7 @@ export const WebSocketActive = ({ myAddress, setIsLoadingGroups }) => { } }; - - initWebsocketMessageGroup(); // Initialize WebSocket on component mount - + initWebsocketMessageGroup(); // Initialize WebSocket on component mount return () => { forceCloseWebSocket(); // Clean up WebSocket on component unmount diff --git a/src/components/Group/useBlockUsers.tsx b/src/components/Group/useBlockUsers.tsx index eeb5361..178c358 100644 --- a/src/components/Group/useBlockUsers.tsx +++ b/src/components/Group/useBlockUsers.tsx @@ -1,218 +1,194 @@ -import React, { useCallback, useEffect, useRef } from "react"; -import { getBaseApiReact } from "../../App"; -import { truncate } from "lodash"; - - +import { useCallback, useEffect, useRef } from 'react'; export const useBlockedAddresses = () => { - const userBlockedRef = useRef({}) - const userNamesBlockedRef = useRef({}) - - const getAllBlockedUsers = useCallback(()=> { + const userBlockedRef = useRef({}); + const userNamesBlockedRef = useRef({}); + const getAllBlockedUsers = useCallback(() => { return { names: userNamesBlockedRef.current, - addresses: userBlockedRef.current - } - }, []) + addresses: userBlockedRef.current, + }; + }, []); - const isUserBlocked = useCallback((address, name)=> { + const isUserBlocked = useCallback((address, name) => { try { - if(!address) return false - if(userBlockedRef.current[address]) return true - return false - - + if (!address) return false; + if (userBlockedRef.current[address]) return true; + return false; } catch (error) { - //error + //error } - }, []) + }, []); - useEffect(()=> { - const fetchBlockedList = async ()=> { + useEffect(() => { + const fetchBlockedList = async () => { try { - const response = await new Promise((res, rej) => { - window.sendMessage("listActions", { - + const response = await new Promise((res, rej) => { + window + .sendMessage('listActions', { type: 'get', listName: `blockedAddresses`, - - }) - .then((response) => { - if (response.error) { - rej(response?.message); - return; - } else { - res(response); - } - }) - .catch((error) => { - console.error("Failed qortalRequest", error); - }); - }) - const blockedUsers = {} - response?.forEach((item)=> { - blockedUsers[item] = true - }) - userBlockedRef.current = blockedUsers + }) + .then((response) => { + if (response.error) { + rej(response?.message); + return; + } else { + res(response); + } + }) + .catch((error) => { + console.error('Failed qortalRequest', error); + }); + }); + const blockedUsers = {}; + response?.forEach((item) => { + blockedUsers[item] = true; + }); + userBlockedRef.current = blockedUsers; - const response2 = await new Promise((res, rej) => { - window.sendMessage("listActions", { - + const response2 = await new Promise((res, rej) => { + window + .sendMessage('listActions', { type: 'get', listName: `blockedNames`, - + }) + .then((response) => { + if (response.error) { + rej(response?.message); + return; + } else { + res(response); + } + }) + .catch((error) => { + console.error('Failed qortalRequest', error); + }); + }); + const blockedUsers2 = {}; + response2?.forEach((item) => { + blockedUsers2[item] = true; + }); + userNamesBlockedRef.current = blockedUsers2; + } catch (error) { + console.error(error); + } + }; + fetchBlockedList(); + }, []); + + const removeBlockFromList = useCallback(async (address, name) => { + if (name) { + await new Promise((res, rej) => { + window + .sendMessage('listActions', { + type: 'remove', + items: [name], + listName: 'blockedNames', }) .then((response) => { if (response.error) { rej(response?.message); return; } else { + const copyObject = { ...userNamesBlockedRef.current }; + delete copyObject[name]; + userNamesBlockedRef.current = copyObject; + res(response); } }) .catch((error) => { - console.error("Failed qortalRequest", error); + console.error('Failed qortalRequest', error); }); - }) - const blockedUsers2 = {} - response2?.forEach((item)=> { - blockedUsers2[item] = true - }) - userNamesBlockedRef.current = blockedUsers2 - - - } catch (error) { - console.error(error) - } - } - fetchBlockedList() - }, []) - - const removeBlockFromList = useCallback(async (address, name)=> { - if(name){ - await new Promise((res, rej) => { - window.sendMessage("listActions", { - - type: 'remove', - items: [name] , - listName: 'blockedNames' - - }) - .then((response) => { - if (response.error) { - rej(response?.message); - return; - } else { - - const copyObject = {...userNamesBlockedRef.current} - delete copyObject[name] - userNamesBlockedRef.current = copyObject - - - res(response); - } - }) - .catch((error) => { - console.error("Failed qortalRequest", error); - }); - }) + }); } - if(address){ + if (address) { await new Promise((res, rej) => { - window.sendMessage("listActions", { - + window + .sendMessage('listActions', { type: 'remove', items: [address], - listName: 'blockedAddresses' - - }) - .then((response) => { - if (response.error) { - rej(response?.message); - return; - } else { - - const copyObject = {...userBlockedRef.current} - delete copyObject[address] - userBlockedRef.current = copyObject - - - res(response); - } - }) - .catch((error) => { - console.error("Failed qortalRequest", error); - }); - }) - } - - - }, []) + listName: 'blockedAddresses', + }) + .then((response) => { + if (response.error) { + rej(response?.message); + return; + } else { + const copyObject = { ...userBlockedRef.current }; + delete copyObject[address]; + userBlockedRef.current = copyObject; - const addToBlockList = useCallback(async (address, name)=> { - if(name){ + res(response); + } + }) + .catch((error) => { + console.error('Failed qortalRequest', error); + }); + }); + } + }, []); + + const addToBlockList = useCallback(async (address, name) => { + if (name) { await new Promise((res, rej) => { - window.sendMessage("listActions", { - + window + .sendMessage('listActions', { type: 'add', items: [name], - listName: 'blockedNames' - - }) - .then((response) => { - if (response.error) { - rej(response?.message); - return; - } else { - const copyObject = {...userNamesBlockedRef.current} - copyObject[name] = true - userNamesBlockedRef.current = copyObject - - - res(response); - } - }) - .catch((error) => { - console.error("Failed qortalRequest", error); - }); - }) + listName: 'blockedNames', + }) + .then((response) => { + if (response.error) { + rej(response?.message); + return; + } else { + const copyObject = { ...userNamesBlockedRef.current }; + copyObject[name] = true; + userNamesBlockedRef.current = copyObject; + + res(response); + } + }) + .catch((error) => { + console.error('Failed qortalRequest', error); + }); + }); } - if(address){ + if (address) { await new Promise((res, rej) => { - window.sendMessage("listActions", { - + window + .sendMessage('listActions', { type: 'add', items: [address], - listName: 'blockedAddresses' - - }) - .then((response) => { - if (response.error) { - rej(response?.message); - return; - } else { - - const copyObject = {...userBlockedRef.current} - copyObject[address] = true - userBlockedRef.current = copyObject - - res(response); - } - }) - .catch((error) => { - console.error("Failed qortalRequest", error); - }); - }) + listName: 'blockedAddresses', + }) + .then((response) => { + if (response.error) { + rej(response?.message); + return; + } else { + const copyObject = { ...userBlockedRef.current }; + copyObject[address] = true; + userBlockedRef.current = copyObject; + + res(response); + } + }) + .catch((error) => { + console.error('Failed qortalRequest', error); + }); + }); } - - }, []) + }, []); return { isUserBlocked, addToBlockList, removeBlockFromList, - getAllBlockedUsers + getAllBlockedUsers, }; }; diff --git a/src/components/Group/useHandleUserInfo.tsx b/src/components/Group/useHandleUserInfo.tsx index a497259..622e737 100644 --- a/src/components/Group/useHandleUserInfo.tsx +++ b/src/components/Group/useHandleUserInfo.tsx @@ -1,32 +1,30 @@ -import React, { useCallback, useRef } from "react"; -import { getBaseApiReact } from "../../App"; - - +import { useCallback, useRef } from 'react'; +import { getBaseApiReact } from '../../App'; export const useHandleUserInfo = () => { - const userInfoRef = useRef({}) + const userInfoRef = useRef({}); - - const getIndividualUserInfo = useCallback(async (address)=> { + const getIndividualUserInfo = useCallback(async (address) => { try { - if(!address) return null - if(userInfoRef.current[address] !== undefined) return userInfoRef.current[address] + if (!address) return null; + if (userInfoRef.current[address] !== undefined) + return userInfoRef.current[address]; const url = `${getBaseApiReact()}/addresses/${address}`; - const response = await fetch(url); - if (!response.ok) { - throw new Error("network error"); - } - const data = await response.json(); - userInfoRef.current = { - ...userInfoRef.current, - [address]: data?.level - } - return data?.level + const response = await fetch(url); + if (!response.ok) { + throw new Error('network error'); + } + const data = await response.json(); + userInfoRef.current = { + ...userInfoRef.current, + [address]: data?.level, + }; + return data?.level; } catch (error) { - //error + //error } - }, []) + }, []); return { getIndividualUserInfo, diff --git a/src/components/Home/NewUsersCTA.tsx b/src/components/Home/NewUsersCTA.tsx index 4ad5c79..30dea8a 100644 --- a/src/components/Home/NewUsersCTA.tsx +++ b/src/components/Home/NewUsersCTA.tsx @@ -1,40 +1,40 @@ -import { Box, ButtonBase, Typography } from "@mui/material"; -import React from "react"; -import { Spacer } from "../../common/Spacer"; +import { Box, ButtonBase, Typography } from '@mui/material'; +import { Spacer } from '../../common/Spacer'; export const NewUsersCTA = ({ balance }) => { if (balance === undefined || +balance > 0) return null; return ( Are you a new user? - + {' '} + // TODO translate Please message us on Telegram or Discord if you need 4 QORT to start @@ -43,25 +43,25 @@ export const NewUsersCTA = ({ balance }) => { { if (window?.electronAPI?.openExternal) { window.electronAPI.openExternal( - "https://link.qortal.dev/telegram-invite" + 'https://link.qortal.dev/telegram-invite' ); } else { window.open( - "https://link.qortal.dev/telegram-invite", - "_blank" + 'https://link.qortal.dev/telegram-invite', + '_blank' ); } }} @@ -70,15 +70,15 @@ export const NewUsersCTA = ({ balance }) => { { if (window?.electronAPI?.openExternal) { window.electronAPI.openExternal( - "https://link.qortal.dev/discord-invite" + 'https://link.qortal.dev/discord-invite' ); } else { - window.open("https://link.qortal.dev/discord-invite", "_blank"); + window.open('https://link.qortal.dev/discord-invite', '_blank'); } }} > diff --git a/src/components/Minting/Minting.tsx b/src/components/Minting/Minting.tsx index 84697c8..7187986 100644 --- a/src/components/Minting/Minting.tsx +++ b/src/components/Minting/Minting.tsx @@ -206,7 +206,6 @@ export const Minting = ({ window .sendMessage( 'ADMIN_ACTION', - { type: 'addmintingaccount', value: val, @@ -266,7 +265,7 @@ export const Minting = ({ rej({ message: response.error }); }) .catch((error) => { - rej({ message: error.message || 'An error occurred' }); + rej({ message: error.message || 'An error occurred' }); //TODO translate }); }); } catch (error) { From 072f98c25ec29e7c2b5d9f85e9b0b79c82d60a99 Mon Sep 17 00:00:00 2001 From: Nicola Benaglia Date: Wed, 23 Apr 2025 23:35:56 +0200 Subject: [PATCH 39/39] Update language translations --- public/locales/de/auth.json | 13 +++++--- public/locales/de/core.json | 63 +++++++++++++++++++++++++++++++------ public/locales/en/core.json | 2 +- public/locales/es/auth.json | 13 +++++--- public/locales/es/core.json | 59 +++++++++++++++++++++++++++++----- public/locales/fr/auth.json | 13 +++++--- public/locales/fr/core.json | 59 +++++++++++++++++++++++++++++----- public/locales/it/auth.json | 15 ++++++--- public/locales/it/core.json | 63 +++++++++++++++++++++++++++++++------ public/locales/ru/auth.json | 13 +++++--- public/locales/ru/core.json | 59 +++++++++++++++++++++++++++++----- 11 files changed, 306 insertions(+), 66 deletions(-) diff --git a/public/locales/de/auth.json b/public/locales/de/auth.json index 3e40c57..fc83d42 100644 --- a/public/locales/de/auth.json +++ b/public/locales/de/auth.json @@ -1,6 +1,9 @@ { - "account_many": "Konten", - "account_one": "Konto", + "account": { + "your": "ihr Konto", + "account_many": "Konten", + "account_one": "Konto" + }, "advanced_users": "für fortgeschrittene Benutzer", "apikey": { "alternative": "Alternative: Datei auswählen", @@ -26,7 +29,9 @@ "password": "Passwort", "password_confirmation": "Passwort bestätigen", "return_to_list": "zurück zur Liste", - "wallet_password_confirmation": "Wallet-Passwort bestätigen", - "wallet_password": "Wallet-Passwort", + "wallet": { + "password_confirmation": "Wallet-Passwort bestätigen", + "password": "Wallet-Passwort" + }, "welcome": "willkommen bei" } diff --git a/public/locales/de/core.json b/public/locales/de/core.json index be16346..c2b7a29 100644 --- a/public/locales/de/core.json +++ b/public/locales/de/core.json @@ -1,28 +1,71 @@ { "add": "hinzufügen", - "backup_wallet": "Wallet sichern", "cancel": "abbrechen", "choose": "auswählen", "close": "schließen", "continue": "fortfahren", + "core": { + "block_height": "Blockhöhe", + "information": "Kerninformationen", + "peers": "verbundene Peers", + "version": "Kernversion" + }, "description": "Beschreibung", "edit": "bearbeiten", - "error": "ein Fehler ist aufgetreten", + "export": "exportieren", + "import": "importieren", "last_height": "letzte Höhe", - "loading": "wird geladen...", + "loading": "Lade...", "logout": "abmelden", - "minting_status": "Minting-Status", + "minting_status": "Präge-Status", "payment_notification": "Zahlungsbenachrichtigung", "price": "Preis", - "q_mail": "q-Mail", - "save": "speichern", + "q_mail": "Q-Mail", + "result": { + "error": { + "generic": "Ein Fehler ist aufgetreten", + "incorrect_password": "Falsches Passwort", + "save_qdn": "Speichern in QDN nicht möglich" + }, + "status": { + "minting": "(Prägung)", + "not_minting": "(keine Prägung)", + "synchronized": "synchronisiert", + "synchronizing": "synchronisiere" + }, + "success": { + "publish_qdn": "Erfolgreich in QDN veröffentlicht" + } + }, + "save_options": { + "no_pinned_changes": "Derzeit keine Änderungen an Ihren angehefteten Apps", + "overwrite_changes": "Die App konnte Ihre vorhandenen in QDN gespeicherten angehefteten Apps nicht herunterladen. Möchten Sie diese Änderungen überschreiben?", + "overwrite_qdn": "In QDN überschreiben", + "publish_qdn": "Möchten Sie Ihre Einstellungen in QDN (verschlüsselt) veröffentlichen?", + "qdn": "QDN-Speicherung verwenden", + "register_name": "Sie benötigen einen registrierten Qortal-Namen, um Ihre angehefteten Apps in QDN zu speichern.", + "reset_pinned": "Gefällt Ihnen Ihre aktuellen lokalen Änderungen nicht? Möchten Sie zu den Standard-Anheftungen zurückkehren?", + "reset_qdn": "Gefällt Ihnen Ihre aktuellen lokalen Änderungen nicht? Möchten Sie zu Ihren in QDN gespeicherten Anheftungen zurückkehren?", + "revert_default": "Auf Standard zurücksetzen", + "revert_qdn": "Auf QDN zurücksetzen", + "save_qdn": "In QDN speichern", + "save": "speichern", + "settings": "Sie verwenden die Export/Import-Methode zum Speichern von Einstellungen.", + "unsaved_changes": "Sie haben nicht gespeicherte Änderungen an Ihren angehefteten Apps. Speichern Sie sie in QDN." + }, "settings": "Einstellungen", "supply": "Angebot", + "theme": { + "dark": "Dunkelmodus", + "light": "Hellmodus" + }, "title": "Titel", "tutorial": "Tutorial", - "your_account": "dein Konto", "user_lookup": "Benutzersuche", - "wallet": "Wallet", - "wallet_other": "Wallets", - "welcome": "willkommen" + "wallet": { + "backup_wallet": "Wallet sichern", + "wallet": "Wallet", + "wallet_other": "Wallets" + }, + "welcome": "Willkommen" } diff --git a/public/locales/en/core.json b/public/locales/en/core.json index 37048be..8988c4a 100644 --- a/public/locales/en/core.json +++ b/public/locales/en/core.json @@ -51,7 +51,7 @@ "save_qdn": "save to QDN", "save": "save", "settings": "you are using the export/import way of saving settings.", - "unsaved_changes": " You have unsaved changes to your pinned apps. Save them to QDN." + "unsaved_changes": " you have unsaved changes to your pinned apps. Save them to QDN." }, "settings": "settings", "supply": "supply", diff --git a/public/locales/es/auth.json b/public/locales/es/auth.json index 9cf1910..3c62c24 100644 --- a/public/locales/es/auth.json +++ b/public/locales/es/auth.json @@ -1,6 +1,9 @@ { - "account_many": "cuentas", - "account_one": "cuenta", + "account": { + "your": "tu cuenta", + "account_many": "cuentas", + "account_one": "cuenta" + }, "advanced_users": "para usuarios avanzados", "apikey": { "alternative": "alternativa: Seleccionar archivo", @@ -26,7 +29,9 @@ "password": "contraseña", "password_confirmation": "confirmar contraseña", "return_to_list": "volver a la lista", - "wallet_password_confirmation": "confirmar contraseña del monedero", - "wallet_password": "contraseña del monedero", + "wallet": { + "password_confirmation": "confirmar contraseña del monedero", + "password": "contraseña del monedero" + }, "welcome": "bienvenido a" } diff --git a/public/locales/es/core.json b/public/locales/es/core.json index 9da6f10..78b06e9 100644 --- a/public/locales/es/core.json +++ b/public/locales/es/core.json @@ -1,13 +1,19 @@ { - "add": "añadir", - "backup_wallet": "copia de seguridad del monedero", + "add": "agregar", "cancel": "cancelar", "choose": "elegir", "close": "cerrar", "continue": "continuar", + "core": { + "block_height": "altura de bloque", + "information": "información del núcleo", + "peers": "pares conectados", + "version": "versión del núcleo" + }, "description": "descripción", "edit": "editar", - "error": "ocurrió un error", + "export": "exportar", + "import": "importar", "last_height": "última altura", "loading": "cargando...", "logout": "cerrar sesión", @@ -15,14 +21,51 @@ "payment_notification": "notificación de pago", "price": "precio", "q_mail": "q-mail", - "save": "guardar", - "settings": "configuración", + "result": { + "error": { + "generic": "ocurrió un error", + "incorrect_password": "contraseña incorrecta", + "save_qdn": "no se pudo guardar en QDN" + }, + "status": { + "minting": "(acuñando)", + "not_minting": "(no acuñando)", + "synchronized": "sincronizado", + "synchronizing": "sincronizando" + }, + "success": { + "publish_qdn": "publicado exitosamente en QDN" + } + }, + "save_options": { + "no_pinned_changes": "actualmente no tienes cambios en tus aplicaciones fijadas", + "overwrite_changes": "la aplicación no pudo descargar tus aplicaciones fijadas existentes guardadas en QDN. ¿Deseas sobrescribir esos cambios?", + "overwrite_qdn": "sobrescribir en QDN", + "publish_qdn": "¿Deseas publicar tus configuraciones en QDN (cifrado)?", + "qdn": "usar guardado en QDN", + "register_name": "necesitas un nombre Qortal registrado para guardar tus aplicaciones fijadas en QDN.", + "reset_pinned": "¿No te gustan tus cambios locales actuales? ¿Deseas restablecer las aplicaciones fijadas predeterminadas?", + "reset_qdn": "¿No te gustan tus cambios locales actuales? ¿Deseas restablecer tus aplicaciones fijadas guardadas en QDN?", + "revert_default": "restablecer a predeterminado", + "revert_qdn": "restablecer a QDN", + "save_qdn": "guardar en QDN", + "save": "guardar", + "settings": "estás utilizando el método de exportación/importación para guardar configuraciones.", + "unsaved_changes": "tienes cambios no guardados en tus aplicaciones fijadas. Guárdalos en QDN." + }, + "settings": "configuraciones", "supply": "suministro", + "theme": { + "dark": "modo oscuro", + "light": "modo claro" + }, "title": "título", "tutorial": "tutorial", - "your_account": "tu cuenta", "user_lookup": "búsqueda de usuario", - "wallet": "monedero", - "wallet_other": "monederos", + "wallet": { + "backup_wallet": "respaldar billetera", + "wallet": "billetera", + "wallet_other": "billeteras" + }, "welcome": "bienvenido" } diff --git a/public/locales/fr/auth.json b/public/locales/fr/auth.json index d6e4c16..06d08d5 100644 --- a/public/locales/fr/auth.json +++ b/public/locales/fr/auth.json @@ -1,6 +1,9 @@ { - "account_many": "comptes", - "account_one": "compte", + "account": { + "your": "ton compte", + "account_many": "comptes", + "account_one": "compte" + }, "advanced_users": "pour les utilisateurs avancés", "apikey": { "alternative": "alternative : Sélectionner un fichier", @@ -26,7 +29,9 @@ "password": "mot de passe", "password_confirmation": "confirmer le mot de passe", "return_to_list": "retour à la liste", - "wallet_password_confirmation": "confirmer le mot de passe du portefeuille", - "wallet_password": "mot de passe du portefeuille", + "wallet": { + "password_confirmation": "confirmer le mot de passe du portefeuille", + "password": "mot de passe du portefeuille" + }, "welcome": "bienvenue sur" } diff --git a/public/locales/fr/core.json b/public/locales/fr/core.json index 65191ab..61d231d 100644 --- a/public/locales/fr/core.json +++ b/public/locales/fr/core.json @@ -1,28 +1,71 @@ { "add": "ajouter", - "backup_wallet": "sauvegarde du portefeuille", "cancel": "annuler", "choose": "choisir", "close": "fermer", "continue": "continuer", + "core": { + "block_height": "hauteur de bloc", + "information": "informations du noyau", + "peers": "pairs connectés", + "version": "version du noyau" + }, "description": "description", "edit": "éditer", - "error": "une erreur est survenue", - "last_height": "hauteur finale", + "export": "exporter", + "import": "importer", + "last_height": "dernière hauteur", "loading": "chargement...", "logout": "se déconnecter", - "minting_status": "statut de minage", + "minting_status": "statut de frappe", "payment_notification": "notification de paiement", "price": "prix", "q_mail": "q-mail", - "save": "enregistrer", + "result": { + "error": { + "generic": "une erreur s'est produite", + "incorrect_password": "mot de passe incorrect", + "save_qdn": "impossible d'enregistrer dans QDN" + }, + "status": { + "minting": "(frappe en cours)", + "not_minting": "(pas de frappe)", + "synchronized": "synchronisé", + "synchronizing": "synchronisation en cours" + }, + "success": { + "publish_qdn": "publié avec succès dans QDN" + } + }, + "save_options": { + "no_pinned_changes": "vous n'avez actuellement aucune modification de vos applications épinglées", + "overwrite_changes": "l'application n'a pas pu télécharger vos applications épinglées existantes enregistrées dans QDN. Voulez-vous écraser ces modifications ?", + "overwrite_qdn": "écraser dans QDN", + "publish_qdn": "souhaitez-vous publier vos paramètres dans QDN (chiffré) ?", + "qdn": "utiliser l'enregistrement QDN", + "register_name": "vous devez avoir un nom Qortal enregistré pour enregistrer vos applications épinglées dans QDN.", + "reset_pinned": "vous n'aimez pas vos modifications locales actuelles ? Voulez-vous réinitialiser les applications épinglées par défaut ?", + "reset_qdn": "vous n'aimez pas vos modifications locales actuelles ? Voulez-vous réinitialiser vos applications épinglées enregistrées dans QDN ?", + "revert_default": "revenir aux paramètres par défaut", + "revert_qdn": "revenir à QDN", + "save_qdn": "enregistrer dans QDN", + "save": "enregistrer", + "settings": "vous utilisez la méthode d'exportation/importation pour enregistrer les paramètres.", + "unsaved_changes": "vous avez des modifications non enregistrées de vos applications épinglées. Enregistrez-les dans QDN." + }, "settings": "paramètres", "supply": "approvisionnement", + "theme": { + "dark": "mode sombre", + "light": "mode clair" + }, "title": "titre", "tutorial": "tutoriel", - "your_account": "votre compte", "user_lookup": "recherche d'utilisateur", - "wallet": "portefeuille", - "wallet_other": "portefeuilles", + "wallet": { + "backup_wallet": "sauvegarder le portefeuille", + "wallet": "portefeuille", + "wallet_other": "portefeuilles" + }, "welcome": "bienvenue" } diff --git a/public/locales/it/auth.json b/public/locales/it/auth.json index e6b35da..345c154 100644 --- a/public/locales/it/auth.json +++ b/public/locales/it/auth.json @@ -1,6 +1,9 @@ { - "account_many": "account", - "account_one": "account", + "account": { + "your": "il tuo account", + "account_many": "account", + "account_one": "account" + }, "advanced_users": "per utenti avanzati", "apikey": { "alternative": "alternativa: seleziona un file", @@ -23,10 +26,12 @@ "using": "nodo in uso", "using_public": "utilizzo nodo pubblico" }, - "password": "password", "password_confirmation": "confirma la password", - "wallet_password_confirmation": "conferma la password del wallet", + "password": "password", + "wallet": { + "password_confirmation": "conferma la password del wallet", + "password": "password del wallet" + }, "return_to_list": "ritorna alla lista", - "wallet_password": "password del wallet", "welcome": "benvenuto in" } diff --git a/public/locales/it/core.json b/public/locales/it/core.json index bc6dd31..8a6c4a2 100644 --- a/public/locales/it/core.json +++ b/public/locales/it/core.json @@ -1,28 +1,71 @@ { "add": "aggiungi", - "backup_wallet": "backup wallet", - "cancel": "cancella", + "cancel": "annulla", "choose": "scegli", "close": "chiudi", "continue": "continua", + "core": { + "block_height": "altezza del blocco", + "information": "informazioni core", + "peers": "peer connessi", + "version": "versione core" + }, "description": "descrizione", "edit": "modifica", - "error": "si è verificato un errore", - "last_height": "ultimo blocco", + "export": "esporta", + "import": "importa", + "last_height": "ultima altezza", "loading": "caricamento...", "logout": "disconnetti", - "minting_status": "stato minting", - "payment_notification": "notifiche pagamenti", + "minting_status": "stato del conio", + "payment_notification": "notifica di pagamento", "price": "prezzo", "q_mail": "q-mail", - "save": "salva", + "result": { + "error": { + "generic": "si è verificato un errore", + "incorrect_password": "password errata", + "save_qdn": "impossibile salvare su QDN" + }, + "status": { + "minting": "(conio in corso)", + "not_minting": "(conio non attivo)", + "synchronized": "sincronizzato", + "synchronizing": "sincronizzazione in corso" + }, + "success": { + "publish_qdn": "pubblicato con successo su QDN" + } + }, + "save_options": { + "no_pinned_changes": "attualmente non hai modifiche alle tue app appuntate", + "overwrite_changes": "l'app non è riuscita a scaricare le tue app appuntate salvate su QDN. Vuoi sovrascrivere queste modifiche?", + "overwrite_qdn": "sovrascrivi su QDN", + "publish_qdn": "vuoi pubblicare le tue impostazioni su QDN (crittografate)?", + "qdn": "usa il salvataggio QDN", + "register_name": "hai bisogno di un nome Qortal registrato per salvare le tue app appuntate su QDN.", + "reset_pinned": "non ti piacciono le modifiche locali attuali? Vuoi ripristinare le app appuntate predefinite?", + "reset_qdn": "non ti piacciono le modifiche locali attuali? Vuoi ripristinare le tue app appuntate salvate su QDN?", + "revert_default": "ripristina predefinite", + "revert_qdn": "ripristina da QDN", + "save_qdn": "salva su QDN", + "save": "salva", + "settings": "stai utilizzando il metodo esporta/importa per salvare le impostazioni.", + "unsaved_changes": "hai modifiche non salvate alle tue app appuntate. Salvale su QDN." + }, "settings": "impostazioni", "supply": "offerta", + "theme": { + "dark": "modalità scura", + "light": "modalità chiara" + }, "title": "titolo", "tutorial": "tutorial", - "your_account": "il tuo account", "user_lookup": "ricerca utente", - "wallet": "wallet", - "wallet_other": "wallet", + "wallet": { + "backup_wallet": "backup portafoglio", + "wallet": "portafoglio", + "wallet_other": "portafogli" + }, "welcome": "benvenuto" } diff --git a/public/locales/ru/auth.json b/public/locales/ru/auth.json index 5a47cc2..3ae2327 100644 --- a/public/locales/ru/auth.json +++ b/public/locales/ru/auth.json @@ -1,6 +1,9 @@ { - "account_many": "аккаунты", - "account_one": "аккаунт", + "account": { + "your": "Ваш аккаунт", + "account_many": "аккаунты", + "account_one": "аккаунт" + }, "advanced_users": "для продвинутых пользователей", "apikey": { "alternative": "альтернатива: выбрать файл", @@ -26,7 +29,9 @@ "password": "пароль", "password_confirmation": "подтвердите пароль", "return_to_list": "вернуться к списку", - "wallet_password_confirmation": "подтвердите пароль кошелька", - "wallet_password": "пароль кошелька", + "wallet": { + "password_confirmation": "подтвердите пароль кошелька", + "password": "пароль кошелька" + }, "welcome": "добро пожаловать в" } diff --git a/public/locales/ru/core.json b/public/locales/ru/core.json index 2dc0810..04bf898 100644 --- a/public/locales/ru/core.json +++ b/public/locales/ru/core.json @@ -1,28 +1,71 @@ { "add": "добавить", - "backup_wallet": "резервная копия кошелька", "cancel": "отмена", "choose": "выбрать", "close": "закрыть", "continue": "продолжить", + "core": { + "block_height": "высота блока", + "information": "информация ядра", + "peers": "подключенные узлы", + "version": "версия ядра" + }, "description": "описание", "edit": "редактировать", - "error": "произошла ошибка", + "export": "экспорт", + "import": "импорт", "last_height": "последняя высота", "loading": "загрузка...", "logout": "выйти", - "minting_status": "статус майнинга", + "minting_status": "статус чеканки", "payment_notification": "уведомление о платеже", "price": "цена", "q_mail": "q-mail", - "save": "сохранить", + "result": { + "error": { + "generic": "произошла ошибка", + "incorrect_password": "неверный пароль", + "save_qdn": "не удалось сохранить в QDN" + }, + "status": { + "minting": "(чеканка)", + "not_minting": "(не чеканится)", + "synchronized": "синхронизировано", + "synchronizing": "синхронизация" + }, + "success": { + "publish_qdn": "успешно опубликовано в QDN" + } + }, + "save_options": { + "no_pinned_changes": "у вас нет изменений в закреплённых приложениях", + "overwrite_changes": "приложению не удалось загрузить ваши закреплённые приложения, сохранённые в QDN. Хотите перезаписать эти изменения?", + "overwrite_qdn": "перезаписать в QDN", + "publish_qdn": "хотите опубликовать свои настройки в QDN (зашифровано)?", + "qdn": "использовать сохранение в QDN", + "register_name": "вам необходимо зарегистрированное имя Qortal для сохранения закреплённых приложений в QDN.", + "reset_pinned": "не устраивают текущие локальные изменения? Хотите сбросить до приложений по умолчанию?", + "reset_qdn": "не устраивают текущие локальные изменения? Хотите сбросить до сохранённых в QDN приложений?", + "revert_default": "сбросить до стандартных", + "revert_qdn": "сбросить до QDN", + "save_qdn": "сохранить в QDN", + "save": "сохранить", + "settings": "вы используете метод экспорта/импорта для сохранения настроек.", + "unsaved_changes": "у вас есть несохранённые изменения в закреплённых приложениях. Сохраните их в QDN." + }, "settings": "настройки", "supply": "предложение", + "theme": { + "dark": "тёмная тема", + "light": "светлая тема" + }, "title": "заголовок", - "tutorial": "руководство", - "your_account": "ваш аккаунт", + "tutorial": "учебник", "user_lookup": "поиск пользователя", - "wallet": "кошелек", - "wallet_other": "кошельки", + "wallet": { + "backup_wallet": "резервная копия кошелька", + "wallet": "кошелёк", + "wallet_other": "кошельки" + }, "welcome": "добро пожаловать" }