Skip to content

Commit

Permalink
Merge pull request #73 from UselessStudio/dev
Browse files Browse the repository at this point in the history
Release 0.4.1
  • Loading branch information
LowderPlay authored Jan 22, 2025
2 parents bbf7809 + 6011b15 commit 9da7086
Show file tree
Hide file tree
Showing 10 changed files with 3,234 additions and 3,129 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

Telegram Mini App that allows you to generate one-time 2FA passwords inside Telegram.

[➡️ **OPEN**]([TeleOTP](http://t.me/TeleOTPAppBot))
[➡️ **OPEN**](http://t.me/TeleOTPAppBot)

## ✨ Features

Expand Down
4 changes: 4 additions & 0 deletions bot/lang/hi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ButtonText: खोले TeleOTP
Welcome: '👋 TeleOTP में स्वागत है!'
ICanHelp: मैं आपकी मदद कर सकता हूँ आपके खातों को 2FA से सुरक्षित करने में।
ClickButton: शुरू करने के लिए नीचे दिए गए बटन पर क्लिक करें!
4 changes: 4 additions & 0 deletions bot/lang/pt.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
ButtonText: Abrir TeleOTP
Welcome: '👋 Bem-vindo ao TeleOTP!'
ICanHelp: Posso te ajudar a proteger suas contas com o 2FA.
ClickButton: Clique no botão abaixo para começar!
6,049 changes: 2,974 additions & 3,075 deletions package-lock.json

Large diffs are not rendered by default.

84 changes: 42 additions & 42 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "teleotp",
"private": true,
"version": "0.4.0",
"version": "0.4.1",
"type": "module",
"homepage": "https://github.com/UselessStudio/TeleOTP",
"scripts": {
Expand All @@ -13,56 +13,56 @@
"test": "vitest"
},
"dependencies": {
"@emotion/react": "^11.13.0",
"@emotion/styled": "^11.11.0",
"@fontsource/inter": "^5.0.8",
"@mui/icons-material": "^5.14.9",
"@mui/material": "^5.14.10",
"@uiw/color-convert": "^2.1.1",
"@uiw/react-color-colorful": "^2.0.6",
"@emotion/react": "^11.14.0",
"@emotion/styled": "^11.14.0",
"@fontsource/inter": "^5.1.1",
"@mui/icons-material": "^6.4.1",
"@mui/material": "^6.4.1",
"@uiw/color-convert": "^2.3.4",
"@uiw/react-color-colorful": "^2.3.4",
"copy-text-to-clipboard": "^3.2.0",
"crypto-js": "4.1.1",
"fuse.js": "^7.0.0",
"lottie-react": "^2.4.0",
"nanoid": "^5.0.1",
"otpauth": "^9.1.4",
"plausible-tracker": "^0.3.8",
"protobufjs": "^7.3.2",
"rdndmb-html5-to-touch": "^8.0.3",
"react": "^18.2.0",
"lottie-react": "^2.4.1",
"nanoid": "^5.0.9",
"otpauth": "^9.3.6",
"plausible-tracker": "^0.3.9",
"protobufjs": "^7.4.0",
"rdndmb-html5-to-touch": "^8.1.2",
"react": "^18.0.0",
"react-dnd": "^16.0.1",
"react-dnd-html5-backend": "^16.0.1",
"react-dnd-multi-backend": "^8.0.3",
"react-dnd-preview": "^8.0.3",
"react-dnd-multi-backend": "^8.1.2",
"react-dnd-preview": "^8.1.2",
"react-dnd-touch-backend": "^16.0.1",
"react-dom": "^18.2.0",
"react-flip-toolkit": "7.1.0",
"react-inlinesvg": "^4.1.3",
"react-dom": "^18.0.0",
"react-flip-toolkit": "7.2.4",
"react-inlinesvg": "^4.1.8",
"react-qrcode-logo": "^3.0.0",
"react-router-dom": "^6.16.0",
"use-debounce": "^10.0.0"
"react-router-dom": "^7.1.3",
"use-debounce": "^10.0.4"
},
"devDependencies": {
"@testing-library/jest-dom": "^6.4.1",
"@testing-library/react": "^14.2.1",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.2.0",
"@twa-dev/types": "github:UselessStudio/twa-types",
"@types/crypto-js": "^4.1.2",
"@types/jest": "^29.5.12",
"@types/node": "^22.1.0",
"@types/react": "^18.2.73",
"@types/react-dom": "^18.2.23",
"@typescript-eslint/eslint-plugin": "^7.5.0",
"@typescript-eslint/parser": "^7.5.0",
"@vitejs/plugin-react": "^4.2.1",
"eslint": "^8.57.0",
"eslint-plugin-react": "^7.34.1",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-react-refresh": "^0.4.6",
"jsdom": "^24.0.0",
"protobufjs-cli": "^1.1.2",
"typescript": "^5.4.3",
"vite": "5.2.7",
"vite-plugin-svgr": "^4.2.0",
"vitest": "^1.5.2"
"@types/crypto-js": "^4.1.1",
"@types/jest": "^29.5.14",
"@types/node": "^22.10.7",
"@types/react": "^19.0.7",
"@types/react-dom": "^19.0.3",
"@typescript-eslint/eslint-plugin": "^8.21.0",
"@typescript-eslint/parser": "^8.21.0",
"@vitejs/plugin-react": "^4.3.4",
"eslint": "^9.18.0",
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-refresh": "^0.4.18",
"jsdom": "^26.0.0",
"protobufjs-cli": "^1.1.3",
"typescript": "^5.7.3",
"vite": "^6.0.11",
"vite-plugin-svgr": "^4.3.0",
"vitest": "^3.0.3"
}
}
20 changes: 14 additions & 6 deletions src/components/AccountSelectButton.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
import {Box, ButtonBase, CircularProgress, Stack, SvgIcon, SxProps, Theme, Typography} from "@mui/material";
import {
Box,
ButtonBase,
CircularProgress,
Stack,
SvgIcon,
SxProps,
Theme,
TouchRippleActions,
Typography
} from "@mui/material";
import {FC, useContext, useEffect, useRef, useState} from "react";
import { icons } from "../globals";
import SVG from 'react-inlinesvg';
Expand All @@ -9,7 +19,6 @@ import {DragTypes, wobbleAnimation} from "../drag.ts";
import {getEmptyImage} from "react-dnd-html5-backend";
import {StorageManagerContext} from "../managers/storage/storage.tsx";
import useTelegramHaptics from "../hooks/telegram/useTelegramHaptics.ts";
import TouchRipple, {TouchRippleActions} from "@mui/material/ButtonBase/TouchRipple.js";

export interface AccountSelectButtonProps {
id: string;
Expand Down Expand Up @@ -44,7 +53,7 @@ const AccountSelectButton: FC<AccountSelectButtonProps> = (props) => {
const storageManager = useContext(StorageManagerContext);
const { impactOccurred } = useTelegramHaptics();

const rippleRef = useRef<TouchRippleActions>();
const rippleRef = useRef<TouchRippleActions>(null);

const [isHolding, setHolding] = useState<boolean>(false);
const [isTouching, setTouching] = useState<boolean>(false);
Expand Down Expand Up @@ -94,7 +103,7 @@ const AccountSelectButton: FC<AccountSelectButtonProps> = (props) => {
}
},
});
const ref = useRef();
const ref = useRef(null);
drag(drop(ref));

return <ButtonBase component="div"
Expand All @@ -104,7 +113,7 @@ const AccountSelectButton: FC<AccountSelectButtonProps> = (props) => {
opacity: isDragging ? 0: 1,
...(isHolding ? wobbleAnimation : {})
}}
disableRipple={true}
touchRippleRef={rippleRef}
onClick={onClick}
onTouchMove={() => {
if(!isHolding) {
Expand All @@ -118,7 +127,6 @@ const AccountSelectButton: FC<AccountSelectButtonProps> = (props) => {
onTouchEnd={() => { setTouching(false); }}
onTouchStart={() => { setTouching(true); }}
>
<TouchRipple ref={rippleRef}/>
<Box sx={{bgcolor: selected ? theme.palette.primary.main : theme.palette.background.paper,
padding: theme.spacing(1), borderRadius: "6px"}} ref={ref}>
<Stack alignItems="center" spacing={1} justifyContent="space-between">
Expand Down
4 changes: 1 addition & 3 deletions src/components/PlausibleAnalytics.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
import {createContext, FC, PropsWithChildren, useEffect, useMemo} from "react";
import Plausible from "plausible-tracker";
import {EventOptions} from "plausible-tracker/src/lib/request.ts";
import {PlausibleOptions} from "plausible-tracker/src/lib/tracker.ts";
import Plausible, {EventOptions, PlausibleOptions} from "plausible-tracker";

/**
* PlausibleAnalytics is responsible for tracking custom event goals.
Expand Down
12 changes: 10 additions & 2 deletions src/globals.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ export const colors: string[] = [

export type Color = string;

export const languages = ["en", "ru", "uk", "de", "fr", "es"] as const;
export const languages = ["en", "ru", "uk", "de", "fr", "es", "hi", "pt"] as const;
export const languageDescriptions: Record<Language, LanguageDescription> = {
"en": {
native: "English",
Expand All @@ -56,6 +56,14 @@ export const languageDescriptions: Record<Language, LanguageDescription> = {
"es": {
native: "Español",
default: "Spanish"
}
},
"hi": {
native: "हिन्दी",
default: "Hindi"
},
"pt": {
native: "Português",
default: "Portuguese",
},
} as const;
export const defaultLanguage: Language = "en";
92 changes: 92 additions & 0 deletions src/lang/hi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
export const lang = {
"Settings.General": "सामान्य",
"Language": "भाषा",
"NewsChannel": "TeleOTP समाचार",
"ActionOpen": "खोलें",
"Settings.Security": "सुरक्षा",
"Password": "पासवर्ड",
"ActionChange": "बदलें",
"KeepUnlocked": "अनलॉक रखें",
"Enabled": "सक्षम",
"Disabled": "अक्षम",
"UseBiometrics": "बायोमेट्रिक्स का उपयोग करें",
"NotAvailable": "उपलब्ध नहीं",
"LockAccounts": "खाते लॉक करें",
"Settings.Accounts": "खाते",
"Accounts": "खाते",
"ActionExportAccounts": "खाते निर्यात करें",
"ActionRemoveAccounts": "सभी खाते हटाएं",
"Version": "संस्करण",
"StarUs": "GitHub पर हमें स्टार दें",
"HelpTranslating": "अनुवाद में मदद करें",
"DevTools": "डेव टूल्स",
"ActionOpenSettings": "सेटिंग्स खोलें",
"ActionChangeMenu": "बदलें...",
"ActionMoreMenu": "अधिक...",
"ActionAddNewAccount": "नया खाता जोड़ें",
"NewUpdateTitle": "क्या आपको TeleOTP पसंद है?",
"NewUpdateText": "घोषणाओं और नए रिलीज़ के लिए हमारे चैनल से जुड़े रहें",
"ActionLearnMore": "अधिक जानें",
"ExportAccountsTitle": "खाते निर्यात करें",
"ExportAccountsText": "आप TeleOTP का उपयोग करके खातों को लिंक से निर्यात कर सकते हैं, या Google Authenticator (या इसी तरह) में QR कोड का उपयोग कर सकते हैं।",
"GoBackAction": "वापस जाएं",
"CopyLinkAction": "लिंक कॉपी करें",
"Export.ViaLink": "लिंक के माध्यम से",
"Export.ViaQR": "QR के माध्यम से",
"LinkExportTitle": "निर्यात लिंक",
"LinkExportDescription": "खातों को अन्य Telegram उपयोगकर्ता में स्थानांतरित करने के लिए लिंक कॉपी करें। या बस इसे बैकअप के लिए रखें।",
"LinkExportSecretWarning": "इसे गोपनीय रखें! कोई भी इस लिंक का उपयोग करके आपके कोड्स तक पहुंच सकता है।",
"QRExportDescription": "आप Google Authenticator या TeleOTP में अपने खातों को QR कोड स्कैन करके आयात कर सकते हैं।",
"EmptyLabelAlert": "लेबल फ़ील्ड खाली नहीं हो सकता!",
"CreateAction": "बनाएं",
"NewAccountTitle": "नया खाता जोड़ें",
"AdditionalInfo": "अतिरिक्त खाता जानकारी दर्ज करें",
"LabelLabel": "लेबल",
"RequiredLabel": "(आवश्यक)",
"IssuerLabel": "सेवा",
"DecryptAction": "डिक्रिप्ट करें",
"DecryptTitle": "अपने खातों को डिक्रिप्ट करें",
"DecryptDescription": "अपने खातों तक पहुंच प्राप्त करने के लिए अपना डिक्रिप्शन पासवर्ड दर्ज करें",
"PasswordLabel": "पासवर्ड",
"WrongPasswordError": "गलत पासवर्ड",
"ResetPasswordAction": "पासवर्ड रीसेट करें...",
"SaveAction": "सहेजें",
"EditTitle": "खाता जानकारी संपादित करें",
"EditDescription": "खाता जानकारी संशोधित करें",
"DeleteConfirmation": "क्या आप वाकई {account} को हटाना चाहते हैं?",
"Confirm": "हाँ",
"DeleteAccountAction": "खाता हटाएं",
"IconsFetchError": "आइकन डेटा प्राप्त करते समय त्रुटि, कृपया बाद में पुनः प्रयास करें",
"BrowseIconsTitle": "आइकन ब्राउज़ करें",
"SearchPatternLabel": "खोजने के लिए पैटर्न",
"SearchHelper": "कम से कम दो प्रतीक दर्ज करें",
"StartTyping": "खोजने के लिए टाइप करना प्रारंभ करें",
"IconsProvidedBy": "आइकन प्रदान किया गया है ",
"NextStepAction": "अगला",
"AddManualTitle": "मैन्युअल रूप से खाता जोड़ें",
"AddManualDescription": "प्रदान किए गए खाता गुप्त दर्ज करें",
"SecretLabel": "गुप्त",
"InvalidSecretError": "अवैध गुप्त",
"InvalidQRCodeAlert": "अमान्य QR कोड",
"HOTPUnimplementedAlert": "HOTP समर्थन अभी तक लागू नहीं किया गया है :(",
"NewAccountDescription": "अपने खाते को दो-कारक प्रमाणीकरण के साथ सुरक्षित करें (Google Authenticator आयात भी समर्थित है)",
"ScanQRText": "QR कोड स्कैन करें",
"EnterManuallyAction": "मैन्युअल रूप से दर्ज करें",
"ChangePasswordAction": "पासवर्ड बदलें",
"CreatePasswordAction": "पासवर्ड सेट करें",
"ChangePasswordTitle": "नया पासवर्ड सेट करें",
"CreatePasswordTitle": "पासवर्ड सेटअप",
"PasswordSetupDescription": "अपने खातों को सुरक्षित रूप से संग्रहीत करने के लिए एक नया एन्क्रिप्शन पासवर्ड दर्ज करें",
"PasswordRequirementError": "पासवर्ड की लंबाई 3 या अधिक होनी चाहिए",
"RepeatPasswordLabel": "पासवर्ड दोहराएं",
"PasswordRepeatIncorrectError": "पासवर्ड मेल नहीं खाता",
"RemovePermanentlyAction": "स्थायी रूप से हटाएं",
"PasswordResetTitle": "पासवर्ड रीसेट",
"DeleteWarning": "आप स्थायी रूप से अपने सभी खातों को हटाने वाले हैं। आप उन्हें पुनर्स्थापित नहीं कर पाएंगे।",
"TypeDeleteConfirmationPhrase": "यदि आप पूरी तरह से सुनिश्चित हैं, तो वाक्यांश टाइप करें",
"DeleteConfirmationPhrase": "हाँ, सब कुछ हटाएं",
"DeleteConfirmationLabel": "अपने खातों को हटाएं और पासवर्ड रीसेट करें?",
"DeleteConfirmationPhraseError": "\"{phrase}\" टाइप करें",
"BiometricsRequestReason": "अपने खातों को डिक्रिप्ट करने के लिए बायोमेट्रिक्स तक पहुंच की अनुमति दें",
"BiometricsAuthenticateReason": "अपने खातों को डिक्रिप्ट करने के लिए प्रमाणित करें"
};
Loading

0 comments on commit 9da7086

Please sign in to comment.