getTurboModule(
27 | const std::string name,
28 | const JavaTurboModule::InitParams ¶ms) override;
29 |
30 | /**
31 | * Test-only method. Allows user to verify whether a TurboModule can be
32 | * created by instances of this class.
33 | */
34 | bool canCreateTurboModule(std::string name);
35 | };
36 |
37 | } // namespace react
38 | } // namespace facebook
39 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/walletapp/newarchitecture/components/MainComponentsRegistry.java:
--------------------------------------------------------------------------------
1 | package com.walletapp.newarchitecture.components;
2 |
3 | import com.facebook.jni.HybridData;
4 | import com.facebook.proguard.annotations.DoNotStrip;
5 | import com.facebook.react.fabric.ComponentFactory;
6 | import com.facebook.soloader.SoLoader;
7 |
8 | /**
9 | * Class responsible to load the custom Fabric Components. This class has native methods and needs a
10 | * corresponding C++ implementation/header file to work correctly (already placed inside the jni/
11 | * folder for you).
12 | *
13 | * Please note that this class is used ONLY if you opt-in for the New Architecture (see the
14 | * `newArchEnabled` property). Is ignored otherwise.
15 | */
16 | @DoNotStrip
17 | public class MainComponentsRegistry {
18 | static {
19 | SoLoader.loadLibrary("fabricjni");
20 | }
21 |
22 | @DoNotStrip private final HybridData mHybridData;
23 |
24 | @DoNotStrip
25 | private native HybridData initHybrid(ComponentFactory componentFactory);
26 |
27 | @DoNotStrip
28 | private MainComponentsRegistry(ComponentFactory componentFactory) {
29 | mHybridData = initHybrid(componentFactory);
30 | }
31 |
32 | @DoNotStrip
33 | public static MainComponentsRegistry register(ComponentFactory componentFactory) {
34 | return new MainComponentsRegistry(componentFactory);
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Silvanei Martins
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 | Informação do desenvolvedor:
24 | GitHub: https://github.com/SilvaneiMartins
25 | Porrifólio: https://silvaneimartins.com.br/
26 | LinkedIn: https://www.linkedin.com/in/silvanei-martins-a5412436
27 | Youtube: https://www.youtube.com/channel/UCmYDvec1_liMzbQcbXtuLmg/videos
--------------------------------------------------------------------------------
/src/screens/App/Transcation/styles.ts:
--------------------------------------------------------------------------------
1 | import { Pressable } from 'react-native';
2 | import styled from 'styled-components/native';
3 |
4 | export const Container = styled.View`
5 | flex: 1;
6 | `;
7 |
8 | export const ContentFlat = styled.View`
9 | padding: 5px;
10 | margin-right: 10px;
11 | flex-direction: row;
12 | `;
13 |
14 | export const IconTransaction = styled.Image`
15 | width: 60px;
16 | height: 60px;
17 | `;
18 |
19 | export const DetailsTransaction = styled.View`
20 | flex: 1;
21 | `;
22 |
23 | export const NameTransaction = styled.Text`
24 | font-weight: 900;
25 | font-size: 16px;
26 | color: ${({ theme }) => theme.COLORS.GRAY1};
27 | font-weight: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
28 | `;
29 |
30 | export const SubtTitleTransaction = styled.Text`
31 | font-size: 14px;
32 | color: ${({ theme }) => theme.COLORS.GRAY4};
33 | font-weight: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
34 | `;
35 |
36 | export const AmountTransaction = styled.Text`
37 | font-weight: 900;
38 | font-size: 16px;
39 | color: ${({ theme }) => theme.COLORS.GRAY1};
40 | font-weight: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
41 | `;
42 |
43 | export const ButtonGoBack = styled(Pressable)`
44 | position: absolute;
45 | bottom: 20px;
46 | right: 30px;
47 | padding: 10px;
48 | border-radius: 30px
49 | background-color: ${({ theme }) => theme.COLORS.GRAY4};
50 | `;
--------------------------------------------------------------------------------
/src/screens/App/AddCartao/AddCartao.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Pressable } from 'react-native';
3 | import { useNavigation } from '@react-navigation/native';
4 |
5 | import VisaPng from '../../../assets/visa.png';
6 | import BgPng from '../../../assets/addcard.png';
7 | import ChipPng from '../../../assets/chipcard.png';
8 | import { GoBack } from '../../../components/GoBack'
9 | import {
10 | Container,
11 | Title,
12 | Content,
13 | SubTitle,
14 | ContentChip,
15 | ContetVisa,
16 | } from './styles';
17 |
18 | export const AddCartao = () => {
19 | const navigation = useNavigation();
20 |
21 | const handleAddCartao = () => {
22 | navigation.navigate('DetailsCard');
23 | }
24 |
25 | return (
26 | <>
27 |
28 |
29 | Adicionar Cartão
30 |
31 |
32 |
35 |
36 |
37 |
38 |
39 |
40 |
41 | Adicionar um novo cartão {'\n'}
42 | na sua carteira para uma vida fácil
43 |
44 |
45 | >
46 | )
47 | }
--------------------------------------------------------------------------------
/src/screens/Auth/RecuperarSenha/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from "styled-components/native";
2 |
3 | export const Container = styled.View`
4 | padding: 20px;;
5 | `;
6 |
7 | export const ContentHeadedr = styled.View`
8 | width: 100%;
9 | margin-left: -10px;
10 | align-items: center;
11 | justify-content: space-between;
12 | `;
13 |
14 | export const Title = styled.Text`
15 | text-align: center;
16 | font-size: 25px;
17 | margin-top: 40px;
18 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
19 | `;
20 |
21 | export const Description = styled.Text`
22 | margin-top: 60px;
23 | font-size: 30px;
24 | margin-bottom: 10px;
25 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
26 | `;
27 |
28 | export const ContendBody = styled.View`
29 | margin-top: 80px;
30 | `;
31 |
32 | export const ContentFooter = styled.View`
33 | margin-top: 80px;
34 | align-items: center;
35 | justify-content: center;
36 | `;
37 |
38 | export const ButtonGoBack = styled.TouchableOpacity`
39 | flex-direction: row;
40 | align-items: center;
41 | justify-content: center;
42 | `;
43 |
44 | export const Title1 = styled.Text`
45 | font-size: 14px;
46 | color: ${({ theme }) => theme.COLORS.GRAY3};
47 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
48 | `;
49 |
50 | export const Title2 = styled.Text`
51 | margin-left: 10px;
52 | font-size: 17px;
53 | color: ${({ theme }) => theme.COLORS.BLUE};
54 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
55 | `;
56 |
--------------------------------------------------------------------------------
/android/app/BUCK:
--------------------------------------------------------------------------------
1 | # To learn about Buck see [Docs](https://buckbuild.com/).
2 | # To run your application with Buck:
3 | # - install Buck
4 | # - `npm start` - to start the packager
5 | # - `cd android`
6 | # - `keytool -genkey -v -keystore keystores/debug.keystore -storepass android -alias androiddebugkey -keypass android -dname "CN=Android Debug,O=Android,C=US"`
7 | # - `./gradlew :app:copyDownloadableDepsToLibs` - make all Gradle compile dependencies available to Buck
8 | # - `buck install -r android/app` - compile, install and run application
9 | #
10 |
11 | load(":build_defs.bzl", "create_aar_targets", "create_jar_targets")
12 |
13 | lib_deps = []
14 |
15 | create_aar_targets(glob(["libs/*.aar"]))
16 |
17 | create_jar_targets(glob(["libs/*.jar"]))
18 |
19 | android_library(
20 | name = "all-libs",
21 | exported_deps = lib_deps,
22 | )
23 |
24 | android_library(
25 | name = "app-code",
26 | srcs = glob([
27 | "src/main/java/**/*.java",
28 | ]),
29 | deps = [
30 | ":all-libs",
31 | ":build_config",
32 | ":res",
33 | ],
34 | )
35 |
36 | android_build_config(
37 | name = "build_config",
38 | package = "com.walletapp",
39 | )
40 |
41 | android_resource(
42 | name = "res",
43 | package = "com.walletapp",
44 | res = "src/main/res",
45 | )
46 |
47 | android_binary(
48 | name = "app",
49 | keystore = "//android/keystores:debug",
50 | manifest = "src/main/AndroidManifest.xml",
51 | package_type = "debug",
52 | deps = [
53 | ":app-code",
54 | ],
55 | )
56 |
--------------------------------------------------------------------------------
/src/screens/Auth/Cadastro/styles.ts:
--------------------------------------------------------------------------------
1 | import { Pressable } from 'react-native';
2 | import styled from 'styled-components/native';
3 |
4 | export const Container = styled.View`
5 | padding: 20px;
6 | `;
7 |
8 | export const ContentHeader = styled.View`
9 | width: 100%;
10 | margin-left: -10px;
11 | align-items: center;
12 | justify-content: space-between;
13 | `;
14 |
15 | export const Title = styled.Text`
16 | text-align: center;
17 | font-size: 25px;
18 | margin-top: 40px;
19 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
20 | `;
21 |
22 | export const Description = styled.Text`
23 | font-size: 35px;
24 | margin-top: 60px;
25 | margin-bottom: 10px;
26 | font-family: ${({ theme }) => theme.FONTS.POPPINSEXTRABOLD};
27 | `;
28 |
29 | export const ContentBody = styled.View`
30 | margin-bottom: 20px;
31 | `;
32 |
33 | export const ContentFoooter = styled.View`
34 | margin-top: 50px;
35 | align-items: center;
36 | justify-content: center;
37 | `;
38 |
39 | export const ButtonFooter = styled(Pressable)`
40 | align-items: center;
41 | justify-content: center;
42 | flex-direction: row;
43 | `;
44 |
45 | export const Title1 = styled.Text`
46 | font-size: 14px;
47 | color: ${({ theme }) => theme.COLORS.GRAY3};
48 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
49 | `;
50 |
51 | export const Title2 = styled.Text`
52 | font-size: 14px;
53 | margin-left: 10px;
54 | color: ${({ theme }) => theme.COLORS.BLUE};
55 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
56 | `;
57 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "expo/tsconfig.base",
3 | "compilerOptions": {
4 | "target": "esnext",
5 | "module": "commonjs",
6 | "lib": [
7 | "es2017"
8 | ],
9 | "allowJs": true,
10 | "jsx": "react-native",
11 | "noEmit": true,
12 | "isolatedModules": true,
13 | "strict": true,
14 | "moduleResolution": "node",
15 | "allowSyntheticDefaultImports": true,
16 | "forceConsistentCasingInFileNames": true,
17 | "esModuleInterop": true,
18 | "skipLibCheck": true,
19 | "resolveJsonModule": true,
20 | "baseUrl": "./",
21 | "paths": {
22 | "@src/*": [
23 | "./src/*"
24 | ],
25 | "@assets/*": [
26 | "./assets/*"
27 | ],
28 | "@components/*": [
29 | "./components/*"
30 | ],
31 | "@config/*": [
32 | "./config/*"
33 | ],
34 | "@hooks/*": [
35 | "./hooks/*"
36 | ],
37 | "@routes/*": [
38 | "./routes/*"
39 | ],
40 | "@screens/*": [
41 | "./screens/*"
42 | ],
43 | "@services/*": [
44 | "./services/*"
45 | ],
46 | "@styles/*": [
47 | "./styles/*"
48 | ],
49 | "@utils/*": [
50 | "./utils/*"
51 | ]
52 | }
53 | },
54 | "include": [
55 | "src/**/*"
56 | ],
57 | }
--------------------------------------------------------------------------------
/src/components/Notifications/ContentTop/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components/native';
2 |
3 | export const ContentFlat = styled.View`
4 | margin-top: 10px;
5 | border-radius: 17px;
6 | flex-direction: row;
7 | align-items: center;
8 | justify-content: space-between;
9 | background-color: ${({ theme }) => theme.COLORS.WHITE};
10 | `;
11 |
12 | export const NewNotificationsFlat = styled.View`
13 | width: 83%;
14 | height: 88px;
15 | padding: 10px;
16 | padding-left: 20px;
17 | `;
18 |
19 | export const DataNotifications = styled.Text``;
20 |
21 | export const DataNotificationsText = styled.Text`
22 | font-size: 12px;
23 | color: ${({ theme }) => theme.COLORS.GRAY4};
24 | `;
25 |
26 | export const TitleNotifications = styled.View`
27 | `;
28 |
29 | export const TitleNotificationsText = styled.Text`
30 | font-size: 14px;
31 | font-weight: 500;
32 | color: ${({ theme }) => theme.COLORS.TYPOSECONDARY};
33 | `;
34 |
35 | export const DescriptionNotifications = styled.View``;
36 |
37 | export const DescriptionNotificationsText = styled.Text`
38 | font-size: 12px;
39 | color: ${({ theme }) => theme.COLORS.GRAY4};
40 | `;
41 |
42 | export const NewButtonNotifications = styled.TouchableOpacity`
43 | width: 50px;
44 | height: 88px;
45 | align-items: center;
46 | justify-content: center;
47 | `;
48 |
49 | export const Badge = styled.View`
50 | top: -3px;
51 | right: 8px;
52 | width: 15px;
53 | height: 15px;
54 | position: absolute;
55 | border-radius: 10px;
56 |
57 | background-color: tomato;
58 | `;
59 |
--------------------------------------------------------------------------------
/android/app/src/main/jni/MainApplicationTurboModuleManagerDelegate.cpp:
--------------------------------------------------------------------------------
1 | #include "MainApplicationTurboModuleManagerDelegate.h"
2 | #include "MainApplicationModuleProvider.h"
3 |
4 | namespace facebook {
5 | namespace react {
6 |
7 | jni::local_ref
8 | MainApplicationTurboModuleManagerDelegate::initHybrid(
9 | jni::alias_ref) {
10 | return makeCxxInstance();
11 | }
12 |
13 | void MainApplicationTurboModuleManagerDelegate::registerNatives() {
14 | registerHybrid({
15 | makeNativeMethod(
16 | "initHybrid", MainApplicationTurboModuleManagerDelegate::initHybrid),
17 | makeNativeMethod(
18 | "canCreateTurboModule",
19 | MainApplicationTurboModuleManagerDelegate::canCreateTurboModule),
20 | });
21 | }
22 |
23 | std::shared_ptr
24 | MainApplicationTurboModuleManagerDelegate::getTurboModule(
25 | const std::string name,
26 | const std::shared_ptr jsInvoker) {
27 | // Not implemented yet: provide pure-C++ NativeModules here.
28 | return nullptr;
29 | }
30 |
31 | std::shared_ptr
32 | MainApplicationTurboModuleManagerDelegate::getTurboModule(
33 | const std::string name,
34 | const JavaTurboModule::InitParams ¶ms) {
35 | return MainApplicationModuleProvider(name, params);
36 | }
37 |
38 | bool MainApplicationTurboModuleManagerDelegate::canCreateTurboModule(
39 | std::string name) {
40 | return getTurboModule(name, nullptr) != nullptr ||
41 | getTurboModule(name, {.moduleName = name}) != nullptr;
42 | }
43 |
44 | } // namespace react
45 | } // namespace facebook
46 |
--------------------------------------------------------------------------------
/src/screens/App/Profile/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components/native';
2 |
3 | export const Container = styled.View`
4 | padding: 20px;
5 | `;
6 |
7 | export const Header = styled.View`
8 | width: 100%;
9 | align-items: center;
10 | justify-content: center;
11 | `;
12 |
13 | export const Content = styled.View`
14 | margin-top: 30px;
15 | `;
16 |
17 | export const Footer = styled.View`
18 | margin-top: 10px;
19 | `;
20 |
21 | export const Avatar = styled.Image`
22 | width: 95px;
23 | height: 95px;
24 | border-radius: 45px;
25 | `;
26 |
27 | export const ViewHeader = styled.View`
28 | flex-direction: row;
29 | align-items: center;
30 | justify-content: center;
31 | margin-top: 10px;
32 | `;
33 |
34 | export const HeaderName = styled.Text`
35 | font-size: 22px;
36 | margin-right: 15px;
37 | color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
38 | font-family: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
39 | `;
40 |
41 | export const IconButton = styled.TouchableOpacity`
42 |
43 | `;
44 |
45 | export const ViewFooter = styled.View`
46 | width: 100%;
47 | align-items: center;
48 | justify-content: center;
49 | margin-top: 50px;
50 | `;
51 |
52 | export const TitleFooter = styled.Text`
53 | font-size: 17px;
54 | margin-top: 10px;
55 | color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
56 | font-family: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
57 | `;
58 |
59 | export const ViewIconButton = styled.View`
60 | padding: 10px;
61 | border-radius: 30px;
62 | border-width: 1px;
63 | border-color: ${({ theme }) => theme.COLORS.GRAY5};
64 | `;
--------------------------------------------------------------------------------
/src/App.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { StatusBar } from "expo-status-bar";
3 | import { ThemeProvider } from "styled-components/native";
4 | import { View, ActivityIndicator, Text } from "react-native";
5 | import { NavigationContainer } from '@react-navigation/native';
6 |
7 | import {
8 | useFonts,
9 | Poppins_300Light,
10 | Poppins_400Regular,
11 | Poppins_500Medium,
12 | Poppins_700Bold,
13 | Poppins_800ExtraBold,
14 | } from "@expo-google-fonts/poppins";
15 |
16 | import { DMSans_400Regular } from "@expo-google-fonts/dm-sans";
17 | import { DMSerifDisplay_400Regular } from "@expo-google-fonts/dm-serif-display";
18 |
19 | import theme from "../src/styles/theme";
20 | import { Routes } from './routes'
21 |
22 | export const App = () => {
23 | const [fontsLoaded] = useFonts({
24 | Poppins_300Light,
25 | Poppins_400Regular,
26 | Poppins_500Medium,
27 | Poppins_700Bold,
28 | Poppins_800ExtraBold,
29 | DMSans_400Regular,
30 | DMSerifDisplay_400Regular,
31 | });
32 |
33 | if (!fontsLoaded) {
34 | return ;
35 | }
36 |
37 | return (
38 |
39 |
40 |
41 |
47 |
48 |
49 |
50 |
51 | );
52 | };
--------------------------------------------------------------------------------
/android/app/src/main/jni/Android.mk:
--------------------------------------------------------------------------------
1 | THIS_DIR := $(call my-dir)
2 |
3 | include $(REACT_ANDROID_DIR)/Android-prebuilt.mk
4 |
5 | # If you wish to add a custom TurboModule or Fabric component in your app you
6 | # will have to include the following autogenerated makefile.
7 | # include $(GENERATED_SRC_DIR)/codegen/jni/Android.mk
8 | include $(CLEAR_VARS)
9 |
10 | LOCAL_PATH := $(THIS_DIR)
11 |
12 | # You can customize the name of your application .so file here.
13 | LOCAL_MODULE := walletapp_appmodules
14 |
15 | LOCAL_C_INCLUDES := $(LOCAL_PATH)
16 | LOCAL_SRC_FILES := $(wildcard $(LOCAL_PATH)/*.cpp)
17 | LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)
18 |
19 | # If you wish to add a custom TurboModule or Fabric component in your app you
20 | # will have to uncomment those lines to include the generated source
21 | # files from the codegen (placed in $(GENERATED_SRC_DIR)/codegen/jni)
22 | #
23 | # LOCAL_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
24 | # LOCAL_SRC_FILES += $(wildcard $(GENERATED_SRC_DIR)/codegen/jni/*.cpp)
25 | # LOCAL_EXPORT_C_INCLUDES += $(GENERATED_SRC_DIR)/codegen/jni
26 |
27 | # Here you should add any native library you wish to depend on.
28 | LOCAL_SHARED_LIBRARIES := \
29 | libfabricjni \
30 | libfbjni \
31 | libfolly_runtime \
32 | libglog \
33 | libjsi \
34 | libreact_codegen_rncore \
35 | libreact_debug \
36 | libreact_nativemodule_core \
37 | libreact_render_componentregistry \
38 | libreact_render_core \
39 | libreact_render_debug \
40 | libreact_render_graphics \
41 | librrc_view \
42 | libruntimeexecutor \
43 | libturbomodulejsijni \
44 | libyoga
45 |
46 | LOCAL_CFLAGS := -DLOG_TAG=\"ReactNative\" -fexceptions -frtti -std=c++17 -Wall
47 |
48 | include $(BUILD_SHARED_LIBRARY)
49 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "wallet-app",
3 | "version": "1.0.0",
4 | "main": "index.js",
5 | "scripts": {
6 | "start": "expo start --dev-client",
7 | "android": "expo run:android",
8 | "ios": "expo run:ios",
9 | "web": "expo start --web",
10 | "clean": "cd android && .\\/gradlew clean && cd .. && yarn install && cd .."
11 | },
12 | "dependencies": {
13 | "@expo-google-fonts/dm-sans": "^0.2.2",
14 | "@expo-google-fonts/dm-serif-display": "^0.2.2",
15 | "@expo-google-fonts/poppins": "^0.2.2",
16 | "@expo/vector-icons": "^13.0.0",
17 | "@react-navigation/bottom-tabs": "^6.4.0",
18 | "@react-navigation/native": "^6.0.13",
19 | "@react-navigation/native-stack": "^6.9.0",
20 | "@unform/core": "2.1.3",
21 | "@unform/mobile": "2.1.3",
22 | "expo": "~46.0.9",
23 | "expo-splash-screen": "~0.16.2",
24 | "expo-status-bar": "~1.4.0",
25 | "phosphor-react-native": "^1.1.2",
26 | "react": "18.0.0",
27 | "react-dom": "18.0.0",
28 | "react-native": "0.69.9",
29 | "react-native-gesture-handler": "~2.5.0",
30 | "react-native-iphone-x-helper": "^1.3.1",
31 | "react-native-reanimated": "~2.9.1",
32 | "react-native-responsive-fontsize": "^0.5.1",
33 | "react-native-safe-area-context": "4.3.1",
34 | "react-native-screens": "~3.15.0",
35 | "react-native-svg": "12.3.0",
36 | "react-native-web": "~0.18.7",
37 | "styled-components": "^5.3.5"
38 | },
39 | "devDependencies": {
40 | "@babel/core": "^7.12.9",
41 | "@types/react": "~18.0.0",
42 | "@types/react-native": "~0.69.1",
43 | "@types/styled-components-react-native": "^5.1.3",
44 | "babel-plugin-module-resolver": "^4.1.0",
45 | "typescript": "^4.6.3"
46 | },
47 | "private": true
48 | }
49 |
--------------------------------------------------------------------------------
/ios/Podfile:
--------------------------------------------------------------------------------
1 | require File.join(File.dirname(`node --print "require.resolve('expo/package.json')"`), "scripts/autolinking")
2 | require File.join(File.dirname(`node --print "require.resolve('react-native/package.json')"`), "scripts/react_native_pods")
3 | require File.join(File.dirname(`node --print "require.resolve('@react-native-community/cli-platform-ios/package.json')"`), "native_modules")
4 |
5 | require 'json'
6 | podfile_properties = JSON.parse(File.read(File.join(__dir__, 'Podfile.properties.json'))) rescue {}
7 |
8 | platform :ios, podfile_properties['ios.deploymentTarget'] || '12.4'
9 | install! 'cocoapods',
10 | :deterministic_uuids => false
11 |
12 | target 'walletapp' do
13 | use_expo_modules!
14 | config = use_native_modules!
15 |
16 | use_frameworks! :linkage => podfile_properties['ios.useFrameworks'].to_sym if podfile_properties['ios.useFrameworks']
17 |
18 | # Flags change depending on the env values.
19 | flags = get_default_flags()
20 |
21 | use_react_native!(
22 | :path => config[:reactNativePath],
23 | :hermes_enabled => flags[:hermes_enabled] || podfile_properties['expo.jsEngine'] == 'hermes',
24 | :fabric_enabled => flags[:fabric_enabled],
25 | # An absolute path to your application root.
26 | :app_path => "#{Dir.pwd}/.."
27 | )
28 |
29 | # Uncomment to opt-in to using Flipper
30 | # Note that if you have use_frameworks! enabled, Flipper will not work
31 | #
32 | # if !ENV['CI']
33 | # use_flipper!()
34 | # end
35 |
36 | post_install do |installer|
37 | react_native_post_install(installer)
38 | __apply_Xcode_12_5_M1_post_install_workaround(installer)
39 | end
40 |
41 | post_integrate do |installer|
42 | begin
43 | expo_patch_react_imports!(installer)
44 | rescue => e
45 | Pod::UI.warn e
46 | end
47 | end
48 |
49 | end
50 |
--------------------------------------------------------------------------------
/ios/walletapp/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleSignature
18 | ????
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | NSAppTransportSecurity
26 |
27 | NSAllowsArbitraryLoads
28 |
29 | NSExceptionDomains
30 |
31 | localhost
32 |
33 | NSExceptionAllowsInsecureHTTPLoads
34 |
35 |
36 |
37 |
38 | UILaunchStoryboardName
39 | SplashScreen
40 | UIRequiredDeviceCapabilities
41 |
42 | armv7
43 |
44 | UISupportedInterfaceOrientations
45 |
46 | UIInterfaceOrientationPortrait
47 | UIInterfaceOrientationLandscapeLeft
48 | UIInterfaceOrientationLandscapeRight
49 |
50 | UIViewControllerBasedStatusBarAppearance
51 |
52 | UIStatusBarStyle
53 | UIStatusBarStyleDefault
54 |
55 |
56 |
--------------------------------------------------------------------------------
/src/components/Input/Input.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react'
2 | import Icon from '@expo/vector-icons/Ionicons';
3 | import { useTheme } from 'styled-components';
4 | import { TextInputProps, TouchableOpacity } from 'react-native';
5 |
6 | import { Container, InputContainer } from './styles'
7 |
8 | interface InputProps extends TextInputProps {
9 | iconSize?: number;
10 | iconColor?: string;
11 | LeftIcon?: boolean;
12 | RightIcon?: boolean;
13 | iconName: keyof typeof Icon.glyphMap;
14 | secureTextEntry?: boolean;
15 | }
16 |
17 | const Input = ({
18 | RightIcon,
19 | LeftIcon,
20 | iconName,
21 | iconSize,
22 | iconColor,
23 | secureTextEntry = true,
24 | ...rest
25 | }: InputProps) => {
26 | const { COLORS } = useTheme();
27 |
28 | const [secury, setSecury] = useState(secureTextEntry);
29 |
30 | return (
31 |
32 | {LeftIcon && (
33 |
39 | )}
40 |
46 | {RightIcon && (
47 | setSecury(!secury)}>
48 |
54 |
55 | )}
56 |
57 | )
58 | }
59 |
60 | export default Input
--------------------------------------------------------------------------------
/src/screens/App/Transcation/Transaction.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react'
2 | import { FlatList } from 'react-native';
3 | import { CaretDoubleLeft } from 'phosphor-react-native';
4 | import { useNavigation } from '@react-navigation/native';
5 |
6 | import { Header } from '../../../components/Header';
7 | import { transaction } from '../../../utils/transaction';
8 | import {
9 | Container,
10 | ContentFlat,
11 | IconTransaction,
12 | DetailsTransaction,
13 | NameTransaction,
14 | SubtTitleTransaction,
15 | AmountTransaction,
16 | ButtonGoBack,
17 | } from './styles';
18 |
19 | export const Transaction = () => {
20 | const navigation = useNavigation();
21 |
22 | const handleGoBackHome = () => {
23 | navigation.goBack()
24 | }
25 |
26 | return (
27 | <>
28 |
33 |
34 | (
37 |
38 |
41 |
42 |
43 | {item.title}
44 | {item.subtitle}
45 |
46 |
47 | R$ {item.amount}
48 |
49 | )}
50 | showsVerticalScrollIndicator={false}
51 | />
52 |
53 |
54 |
55 |
56 | >
57 | )
58 | }
--------------------------------------------------------------------------------
/android/app/src/main/java/com/walletapp/newarchitecture/modules/MainApplicationTurboModuleManagerDelegate.java:
--------------------------------------------------------------------------------
1 | package com.walletapp.newarchitecture.modules;
2 |
3 | import com.facebook.jni.HybridData;
4 | import com.facebook.react.ReactPackage;
5 | import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
6 | import com.facebook.react.bridge.ReactApplicationContext;
7 | import com.facebook.soloader.SoLoader;
8 | import java.util.List;
9 |
10 | /**
11 | * Class responsible to load the TurboModules. This class has native methods and needs a
12 | * corresponding C++ implementation/header file to work correctly (already placed inside the jni/
13 | * folder for you).
14 | *
15 | * Please note that this class is used ONLY if you opt-in for the New Architecture (see the
16 | * `newArchEnabled` property). Is ignored otherwise.
17 | */
18 | public class MainApplicationTurboModuleManagerDelegate
19 | extends ReactPackageTurboModuleManagerDelegate {
20 |
21 | private static volatile boolean sIsSoLibraryLoaded;
22 |
23 | protected MainApplicationTurboModuleManagerDelegate(
24 | ReactApplicationContext reactApplicationContext, List packages) {
25 | super(reactApplicationContext, packages);
26 | }
27 |
28 | protected native HybridData initHybrid();
29 |
30 | native boolean canCreateTurboModule(String moduleName);
31 |
32 | public static class Builder extends ReactPackageTurboModuleManagerDelegate.Builder {
33 | protected MainApplicationTurboModuleManagerDelegate build(
34 | ReactApplicationContext context, List packages) {
35 | return new MainApplicationTurboModuleManagerDelegate(context, packages);
36 | }
37 | }
38 |
39 | @Override
40 | protected synchronized void maybeLoadOtherSoLibraries() {
41 | if (!sIsSoLibraryLoaded) {
42 | // If you change the name of your application .so file in the Android.mk file,
43 | // make sure you update the name here as well.
44 | SoLoader.loadLibrary("walletapp_appmodules");
45 | sIsSoLibraryLoaded = true;
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/android/app/src/main/res/drawable/rn_edit_text_material.xml:
--------------------------------------------------------------------------------
1 |
2 |
16 |
21 |
22 |
23 |
32 |
33 |
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/src/components/ButtonPersonalizado/ButtonPersonalizado.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { useTheme } from 'styled-components';
3 | import { AntDesign } from '@expo/vector-icons';
4 | import {
5 | ActivityIndicator,
6 | TouchableOpacityProps,
7 | } from 'react-native';
8 |
9 | import { variants } from './variants';
10 | import { Container, Title, Content } from './styles';
11 |
12 | interface ButtonProps extends TouchableOpacityProps {
13 | title: string;
14 | onPress: () => void;
15 | isLoading?: boolean;
16 | disabled?: boolean;
17 | style?: TouchableOpacityProps["style"];
18 | variant?: "primary" | "outline" | "black" | 'transparent';
19 | iconName?: keyof typeof AntDesign.glyphMap;
20 | }
21 |
22 | export function ButtonPersonalizado({
23 | title,
24 | onPress,
25 | isLoading,
26 | iconName,
27 | disabled,
28 | variant = 'primary',
29 | style,
30 | ...rest
31 | }: ButtonProps) {
32 | const { COLORS } = useTheme();
33 | const buttonVariant = variants[variant];
34 | const buttonStyle = disabled ? buttonVariant.disabled : buttonVariant.enabled;
35 |
36 | return (
37 |
43 | {isLoading ? (
44 |
45 | ) : (
46 |
47 | {iconName && (
48 |
56 | )}
57 | {title}
58 |
59 | )}
60 |
61 | )
62 | }
--------------------------------------------------------------------------------
/android/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
--------------------------------------------------------------------------------
/src/screens/App/DetailsCard/DetailsCard.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { View, Text } from 'react-native';
3 |
4 | import { GoBack } from '../../../components/GoBack';
5 | import detailsCardPng from '../../../assets/carddetails.png';
6 | import { ButtonPersonalizado } from '../../../components/ButtonPersonalizado';
7 | import {
8 | Container,
9 | Title,
10 | CardImage,
11 | Name,
12 | Banco,
13 | Conta,
14 | Status,
15 | Validade,
16 | ViewInfo,
17 | InfoTitle,
18 | ViewDetails,
19 | } from './styles';
20 |
21 | export const DetailsCard = () => {
22 | return (
23 | <>
24 |
25 |
26 | Detalhes do Cartão
27 |
28 |
31 |
32 |
33 |
34 | Nome
35 | Silvanei Martins
36 |
37 |
38 | Banco
39 | Martins
40 |
41 |
42 | Conta
43 | 000934-2
44 |
45 |
46 | Status
47 | Ativo
48 |
49 |
50 | Vencimento
51 | 2022-2025
52 |
53 |
54 |
55 | { }}
59 |
60 | style={{
61 | marginTop: 30,
62 | }}
63 | />
64 |
65 | >
66 | )
67 | }
--------------------------------------------------------------------------------
/src/screens/Auth/RecuperarSenha/RecuperarSenha.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { ScrollView } from 'react-native';
3 | import { useTheme } from 'styled-components/native';
4 | import { useNavigation } from '@react-navigation/native';
5 |
6 | import Input from '../../../components/Input';
7 | import { ButtonPersonalizado } from '../../../components/ButtonPersonalizado';
8 | import {
9 | Container,
10 | ContentHeadedr,
11 | Title,
12 | Description,
13 | ContendBody,
14 | ContentFooter,
15 | ButtonGoBack,
16 | Title1,
17 | Title2,
18 | } from './styles';
19 |
20 | export const RecuperarSenha = () => {
21 | const { COLORS } = useTheme();
22 | const navigation = useNavigation();
23 |
24 | const handleVoltarLogin = () => {
25 | navigation.navigate('Login');
26 | }
27 |
28 | return (
29 |
30 |
31 |
32 | Seja Bem Vindo {'\n'} a App Wallet
33 | Recuperar Senha
34 |
35 |
36 |
37 |
45 |
46 |
47 | { }}
50 | style={{
51 | marginTop: 40
52 | }}
53 | />
54 |
55 |
56 |
57 | Não quer recuperar senha?
58 | Voltar
59 |
60 |
61 |
62 |
63 | )
64 | }
--------------------------------------------------------------------------------
/src/components/Input_old/styles.ts:
--------------------------------------------------------------------------------
1 | import styled, { css } from 'styled-components/native';
2 | import { TextInput, ViewProps } from 'react-native';
3 | import { RFValue } from 'react-native-responsive-fontsize';
4 |
5 | interface IContainerProps extends ViewProps {
6 | hasError: boolean;
7 | isFocused: boolean;
8 | isFilled?: boolean;
9 | }
10 |
11 | interface ITextContainerProps extends ViewProps {
12 | hasError: boolean;
13 | isFocused: boolean;
14 | isFilled?: boolean;
15 | }
16 |
17 | export const Container = styled.View`
18 | width: 85%;
19 | flex-direction: row;
20 | height: ${RFValue(50)}px;
21 | margin-bottom: ${RFValue(10)}px;
22 | `;
23 |
24 | export const IConContainer = styled.View`
25 | width: ${RFValue(55)}px;
26 | height: ${RFValue(50)}px;
27 | justify-content: center;
28 | align-items: center;
29 |
30 | ${({ isFocused, isFilled }) => (isFocused || isFilled) && css`
31 | border-bottom-width: ${RFValue(2)}px;
32 | border-bottom-color; ${({ theme }) => theme.COLORS.BLUE1};
33 | `};
34 |
35 | ${({ hasError }) => hasError && css`
36 | border-bottom-color: ${({ theme }) => theme.COLORS.RED};
37 | `};
38 |
39 | margin-right: ${RFValue(3)}px;
40 | border-top-left-radius: ${RFValue(5)}px;
41 | border-bottom-left-radius: ${RFValue(5)}px;
42 | background-color: ${({ theme }) => theme.COLORS.GRAY5};
43 | `;
44 |
45 | export const InputText = styled(TextInput)`
46 | flex: 1;
47 | font-size: ${RFValue(12)}px;
48 | border-top-right-radius: ${RFValue(5)}px;
49 | border-bottom-right-radius: ${RFValue(5)}px;
50 | color: ${({ theme }) => theme.COLORS.GRAY1};
51 | font-family: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
52 | background-color: ${({ theme }) => theme.COLORS.GRAY5};
53 |
54 | ${({ isFocused, isFilled }) => (isFocused || isFilled) && css`
55 | border-bottom-width: ${RFValue(2)}px;
56 | border-bottom-color; ${({ theme }) => theme.COLORS.BLUE1};
57 | `};
58 |
59 | ${({ hasError }) => hasError && css`
60 | border-bottom-color: ${({ theme }) => theme.COLORS.RED};
61 | `};
62 |
63 | padding: 0 ${RFValue(10)}px;
64 | `;
65 |
--------------------------------------------------------------------------------
/src/screens/Tab/Notificacao/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from "styled-components/native";
2 | import { FlatList } from "react-native";
3 |
4 | export const Container = styled.View`
5 | flex: 1;
6 | `;
7 |
8 | export const ContentHeader = styled.View`
9 | width: 100%;
10 | height: 35%;
11 | align-items: center;
12 | padding: 5px 10px;
13 | `;
14 |
15 | export const ContentTopTitle = styled.Text`
16 | font-size: 20px;
17 | font-weight: bold;
18 | color: ${({ theme }) => theme.COLORS.BLACK};
19 | font-family: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
20 | `;
21 |
22 | export const ContentBody = styled.View`
23 | flex: 1;
24 | width: 100%;
25 | align-items: center;
26 | padding: 0px 10px;
27 | `;
28 |
29 | export const ContentBodyTitle = styled.Text`
30 | font-size: 20px;
31 | font-weight: bold;
32 | color: ${({ theme }) => theme.COLORS.BLACK};
33 | font-family: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
34 | `;
35 |
36 | export const ContentFlat = styled.View`
37 | /* flex: 1; */
38 | margin-top: 10px;
39 | border-radius: 17px;
40 | flex-direction: row;
41 | align-items: center;
42 | justify-content: space-between;
43 | background-color: ${({ theme }) => theme.COLORS.WHITE};
44 | `;
45 |
46 | export const NewNotificationsFlat = styled.View`
47 | width: 83%;
48 | padding: 10px;
49 | height: 88px;
50 | `;
51 |
52 | export const DataNotifications = styled.Text`
53 |
54 | `;
55 |
56 | export const DataNotificationsText = styled.Text`
57 | font-size: 12px;
58 | color: ${({ theme }) => theme.COLORS.GRAY4};
59 | `;
60 |
61 | export const TitleNotifications = styled.View`
62 | `;
63 |
64 | export const TitleNotificationsText = styled.Text`
65 | font-size: 14px;
66 | font-weight: 500;
67 | color: ${({ theme }) => theme.COLORS.TYPOSECONDARY};
68 | `;
69 |
70 | export const DescriptionNotifications = styled.View`
71 |
72 | `;
73 |
74 | export const DescriptionNotificationsText = styled.Text`
75 | font-size: 12px;
76 | color: ${({ theme }) => theme.COLORS.GRAY4};
77 | `;
78 |
79 | export const NewButtonNotifications = styled.TouchableOpacity`
80 | width: 50px;
81 | height: 88px;
82 | align-items: center;
83 | justify-content: center;
84 | `;
85 |
--------------------------------------------------------------------------------
/android/app/src/main/jni/MainComponentsRegistry.cpp:
--------------------------------------------------------------------------------
1 | #include "MainComponentsRegistry.h"
2 |
3 | #include
4 | #include
5 | #include
6 | #include
7 |
8 | namespace facebook {
9 | namespace react {
10 |
11 | MainComponentsRegistry::MainComponentsRegistry(ComponentFactory *delegate) {}
12 |
13 | std::shared_ptr
14 | MainComponentsRegistry::sharedProviderRegistry() {
15 | auto providerRegistry = CoreComponentsRegistry::sharedProviderRegistry();
16 |
17 | // Custom Fabric Components go here. You can register custom
18 | // components coming from your App or from 3rd party libraries here.
19 | //
20 | // providerRegistry->add(concreteComponentDescriptorProvider<
21 | // AocViewerComponentDescriptor>());
22 | return providerRegistry;
23 | }
24 |
25 | jni::local_ref
26 | MainComponentsRegistry::initHybrid(
27 | jni::alias_ref,
28 | ComponentFactory *delegate) {
29 | auto instance = makeCxxInstance(delegate);
30 |
31 | auto buildRegistryFunction =
32 | [](EventDispatcher::Weak const &eventDispatcher,
33 | ContextContainer::Shared const &contextContainer)
34 | -> ComponentDescriptorRegistry::Shared {
35 | auto registry = MainComponentsRegistry::sharedProviderRegistry()
36 | ->createComponentDescriptorRegistry(
37 | {eventDispatcher, contextContainer});
38 |
39 | auto mutableRegistry =
40 | std::const_pointer_cast(registry);
41 |
42 | mutableRegistry->setFallbackComponentDescriptor(
43 | std::make_shared(
44 | ComponentDescriptorParameters{
45 | eventDispatcher, contextContainer, nullptr}));
46 |
47 | return registry;
48 | };
49 |
50 | delegate->buildRegistryFunction = buildRegistryFunction;
51 | return instance;
52 | }
53 |
54 | void MainComponentsRegistry::registerNatives() {
55 | registerHybrid({
56 | makeNativeMethod("initHybrid", MainComponentsRegistry::initHybrid),
57 | });
58 | }
59 |
60 | } // namespace react
61 | } // namespace facebook
62 |
--------------------------------------------------------------------------------
/src/screens/App/DetailsCard/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from 'styled-components/native';
2 |
3 | export const Container = styled.View`
4 | flex: 1;
5 | padding: 30px;
6 | `;
7 |
8 | export const Title = styled.Text`
9 | font-size: 30px;
10 | margin-top: 30px;
11 | text-align: center;
12 | color: ${({ theme }) => theme.COLORS.PURPLE_TEXT};
13 | `;
14 |
15 | export const CardImage = styled.Image`
16 | width: 100%;
17 | height: 220px;
18 | margin-top: 30px;
19 | border-radius: 50px;
20 | `;
21 |
22 | export const ViewDetails = styled.View`
23 | width: 100%;
24 | margin-top: 30px;
25 | align-items: center;
26 | `;
27 |
28 | export const ViewInfo = styled.View`
29 | width: 80%;
30 | padding: 5px 0;
31 | flex-direction: row;
32 | `;
33 |
34 | export const InfoTitle = styled.Text`
35 | font-size: 16px;
36 | line-height: 20px;
37 | color: ${({ theme}) => theme.COLORS.GRAY4};
38 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
39 | `;
40 |
41 | export const Name = styled.Text`
42 | flex: 1;
43 | font-size: 16px;
44 | line-height: 20px;
45 | text-align: right;
46 | color: ${({ theme}) => theme.COLORS.GRAY1};
47 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
48 | `;
49 |
50 | export const Banco = styled.Text`
51 | flex: 1;
52 | font-size: 16px;
53 | line-height: 20px;
54 | text-align: right;
55 | color: ${({ theme}) => theme.COLORS.GRAY1};
56 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
57 | `;
58 |
59 | export const Conta = styled.Text`
60 | flex: 1;
61 | font-size: 16px;
62 | line-height: 20px;
63 | text-align: right;
64 | color: ${({ theme}) => theme.COLORS.GRAY1};
65 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
66 | `;
67 |
68 | export const Status = styled.Text`
69 | flex: 1;
70 | font-size: 16px;
71 | line-height: 20px;
72 | text-align: right;
73 | color: ${({ theme}) => theme.COLORS.GRAY1};
74 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
75 | `;
76 |
77 | export const Validade = styled.Text`
78 | flex: 1;
79 | font-size: 16px;
80 | line-height: 20px;
81 | text-align: right;
82 | color: ${({ theme}) => theme.COLORS.GRAY1};
83 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
84 | `;
85 |
86 |
--------------------------------------------------------------------------------
/src/components/Notifications/ContentTop/ContentTop.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { View, Text } from 'react-native';
3 | import { useTheme } from 'styled-components/native';
4 | import { ArrowCircleUp } from 'phosphor-react-native';
5 |
6 | import { new_notifications } from '../../../utils/new_notifications';
7 |
8 | import {
9 | Badge,
10 | ContentFlat,
11 | DataNotifications,
12 | TitleNotifications,
13 | NewNotificationsFlat,
14 | DataNotificationsText,
15 | TitleNotificationsText,
16 | NewButtonNotifications,
17 | DescriptionNotifications,
18 | DescriptionNotificationsText,
19 | } from './styles';
20 |
21 | interface IContentTopProps {
22 | datetime: string;
23 | title: string;
24 | type: string;
25 | }
26 |
27 |
28 | export const ContentTop = (props: IContentTopProps) => {
29 | const { COLORS } = useTheme();
30 |
31 | const [isVerify, setIsVerify] = useState(false);
32 |
33 | const handleVerify = () => {
34 | setIsVerify(!isVerify);
35 | }
36 |
37 | return (
38 |
39 |
40 |
41 |
42 |
43 | {props.datetime}
44 |
45 |
46 |
47 |
48 |
49 | {props.title}
50 |
51 |
52 |
53 |
54 |
55 | {props.type}
56 |
57 |
58 |
59 |
60 | {isVerify ? (
61 |
62 |
63 |
64 | ) : (
65 |
66 |
67 |
68 | )}
69 |
70 | )
71 | }
--------------------------------------------------------------------------------
/src/screens/Auth/Login/styles.ts:
--------------------------------------------------------------------------------
1 | import { Pressable } from 'react-native';
2 | import styled from 'styled-components/native';
3 | import { RFValue } from 'react-native-responsive-fontsize';
4 |
5 | export const Container = styled.View`
6 | padding: ${RFValue(20)}px;
7 | `;
8 |
9 | export const ContentHeader = styled.View`
10 | width: 100%;
11 | margin-left: -10px;
12 | align-items: center;
13 | justify-content: space-between;
14 | `;
15 |
16 | export const ContentBody = styled.View``;
17 |
18 | export const ViewButton = styled.View`
19 | flex-direction: row;
20 | `;
21 |
22 | export const Title = styled.Text`
23 | text-align: center;
24 | font-size: ${RFValue(25)}px;
25 | margin-top: ${RFValue(40)}px;
26 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
27 | `;
28 |
29 | export const Description = styled.Text`
30 | margin-top: ${RFValue(60)}px;
31 | font-size: ${RFValue(15)}px;
32 | margin-bottom: ${RFValue(10)}px;
33 | font-family: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
34 | `;
35 |
36 | export const ContentFooter = styled.View`
37 | margin-top: 30px;
38 | align-items: center;
39 | justify-content: center;
40 | `;
41 |
42 | export const ButtonSignUp = styled.TouchableOpacity`
43 | align-items: center;
44 | flex-direction: row;
45 | justify-content: center;
46 | `;
47 |
48 | export const TitleButtonSignUp1 = styled.Text`
49 | font-size: 14px;
50 | color: ${({ theme }) => theme.COLORS.GRAY3};
51 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
52 | `;
53 |
54 | export const TitleButtonSingUp2 = styled.Text`
55 | font-size: 17px;
56 | margin-left: 10px;
57 | color: ${({ theme }) => theme.COLORS.BLUE};
58 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
59 | `;
60 |
61 | export const ContentForgotPassword = styled.View`
62 | width: 100%;
63 | padding: 20px;
64 | margin-top: 20px;
65 | align-items: flex-end;
66 | justify-content: flex-end;
67 | `;
68 |
69 |
70 | export const ContentButtonForgotPassword = styled.TouchableOpacity`
71 | align-items: center;
72 | justify-content: flex-end;
73 | `;
74 |
75 | export const ContentTitleForgotPassword = styled.Text`
76 | align-items: flex-end;
77 | font-size: 17px;
78 | color: ${({ theme }) => theme.COLORS.GRAY3};
79 | font-family: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
80 | `;
--------------------------------------------------------------------------------
/android/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx512m -XX:MaxMetaspaceSize=256m
13 | org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
19 |
20 | # AndroidX package structure to make it clearer which packages are bundled with the
21 | # Android operating system, and which are packaged with your app's APK
22 | # https://developer.android.com/topic/libraries/support-library/androidx-rn
23 | android.useAndroidX=true
24 |
25 | # Automatically convert third-party libraries to use AndroidX
26 | android.enableJetifier=true
27 |
28 | # Version of flipper SDK to use with React Native
29 | FLIPPER_VERSION=0.125.0
30 |
31 | # Use this property to specify which architecture you want to build.
32 | # You can also override it from the CLI using
33 | # ./gradlew -PreactNativeArchitectures=x86_64
34 | reactNativeArchitectures=armeabi-v7a,arm64-v8a,x86,x86_64
35 |
36 | # Use this property to enable support to the new architecture.
37 | # This will allow you to use TurboModules and the Fabric render in
38 | # your application. You should enable this flag either if you want
39 | # to write custom TurboModules/Fabric components OR use libraries that
40 | # are providing them.
41 | newArchEnabled=false
42 |
43 | # The hosted JavaScript engine
44 | # Supported values: expo.jsEngine = "hermes" | "jsc"
45 | expo.jsEngine=jsc
46 |
47 | # Enable GIF support in React Native images (~200 B increase)
48 | expo.gif.enabled=true
49 | # Enable webp support in React Native images (~85 KB increase)
50 | expo.webp.enabled=true
51 | # Enable animated webp support (~3.4 MB increase)
52 | # Disabled by default because iOS doesn't support animated webp
53 | expo.webp.animated=false
54 |
--------------------------------------------------------------------------------
/src/utils/recent_notifications.ts:
--------------------------------------------------------------------------------
1 | export const recents_notifications = [
2 | {
3 | id: "1",
4 | datetime: "2021-05-01T00:00:00.000Z",
5 | title: "Você recebeu um novo pagamento R$ 50,00 de Silvio Martins",
6 | type: "Recebimento Pix",
7 | ativo: true,
8 | },
9 | {
10 | id: "2",
11 | datetime: "2021-05-01T00:00:00.000Z",
12 | title: "Você recebeu um novo pagamento R$ 100,00 de Silvio Martins",
13 | type: "Cartão de Debito",
14 | ativo: false,
15 | },
16 | {
17 | id: "3",
18 | datetime: "2021-05-01T00:00:00.000Z",
19 | title: "Você recebeu um novo pagamento R$ 10,00 de Silvio Martins",
20 | type: "Cartão de Crédito",
21 | ativo: false,
22 | },
23 | {
24 | id: "4",
25 | datetime: "2021-05-01T00:00:00.000Z",
26 | title: "Você recebeu um novo pagamento R$ 59,00 de Silvio Martins",
27 | type: "Cartão de Debito",
28 | ativo: false,
29 | },
30 | {
31 | id: "5",
32 | datetime: "2021-05-01T00:00:00.000Z",
33 | title: "Você recebeu um novo pagamento R$ 75,00 de Silvio Martins",
34 | type: "Cartão de Crédito",
35 | ativo: false,
36 | },
37 | {
38 | id: "6",
39 | datetime: "2021-05-01T00:00:00.000Z",
40 | title: "Você recebeu um novo pagamento R$ 36,00 de Silvio Martins",
41 | type: "Cartão de Debito",
42 | ativo: false,
43 | },
44 | {
45 | id: "7",
46 | datetime: "2021-05-01T00:00:00.000Z",
47 | title: "Você recebeu um novo pagamento R$ 100,00 de Silvio Martins",
48 | type: "Cartão de Crédito",
49 | ativo: false,
50 | },
51 | {
52 | id: "8",
53 | datetime: "2021-05-01T00:00:00.000Z",
54 | title: "Você recebeu um novo pagamento R$ 80,00 de Silvio Martins",
55 | type: "Cartão de DEbito",
56 | ativo: false,
57 | },
58 | {
59 | id: "9",
60 | datetime: "2021-05-01T00:00:00.000Z",
61 | title: "Você recebeu um novo pagamento R$ 90,00 de Silvio Martins",
62 | type: "Cartão de Crédito",
63 | ativo: false,
64 | },
65 | {
66 | id: "10",
67 | datetime: "2021-05-01T00:00:00.000Z",
68 | title: "Você recebeu um novo pagamento R$ 30,00 de Silvio Martins",
69 | type: "Cartão de DEbito",
70 | ativo: false,
71 | }
72 | ]
--------------------------------------------------------------------------------
/src/components/Header/Header.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { BellSimpleRinging, ChartBarHorizontal, CurrencyCircleDollar } from 'phosphor-react-native';
3 |
4 | import {
5 | Container,
6 | ContentHeader,
7 | Avatar,
8 | AppName,
9 | Status,
10 | IconButton,
11 | } from './styles';
12 |
13 | interface IHeader {
14 | appName: string;
15 | iconLeft?: boolean;
16 | textLeft?: boolean;
17 | avatarRight?: boolean;
18 | typeRelatorio?: boolean;
19 | typeTransaction?: boolean;
20 | typeNotification?: boolean;
21 | }
22 |
23 | export const Header = ({
24 | iconLeft,
25 | typeRelatorio,
26 | appName,
27 | textLeft,
28 | avatarRight,
29 | typeTransaction,
30 | typeNotification,
31 | }: IHeader) => {
32 | return (
33 |
34 | {iconLeft && (
35 | <>
36 | {typeRelatorio && (
37 |
44 | )}
45 | {typeNotification && (
46 |
53 | )}
54 | {typeTransaction && (
55 |
62 | )}
63 | >
64 | )}
65 |
66 | {appName}
67 | {textLeft && (
68 | Ativo
69 | )}
70 |
71 | {avatarRight && (
72 |
75 | )}
76 |
77 | )
78 | }
--------------------------------------------------------------------------------
/android/build.gradle:
--------------------------------------------------------------------------------
1 | import org.apache.tools.ant.taskdefs.condition.Os
2 |
3 | // Top-level build file where you can add configuration options common to all sub-projects/modules.
4 |
5 | buildscript {
6 | ext {
7 | buildToolsVersion = findProperty('android.buildToolsVersion') ?: '31.0.0'
8 | minSdkVersion = Integer.parseInt(findProperty('android.minSdkVersion') ?: '21')
9 | compileSdkVersion = Integer.parseInt(findProperty('android.compileSdkVersion') ?: '31')
10 | targetSdkVersion = Integer.parseInt(findProperty('android.targetSdkVersion') ?: '31')
11 | if (findProperty('android.kotlinVersion')) {
12 | kotlinVersion = findProperty('android.kotlinVersion')
13 | }
14 | frescoVersion = findProperty('expo.frescoVersion') ?: '2.5.0'
15 |
16 | if (System.properties['os.arch'] == 'aarch64') {
17 | // For M1 Users we need to use the NDK 24 which added support for aarch64
18 | ndkVersion = '24.0.8215888'
19 | } else {
20 | // Otherwise we default to the side-by-side NDK version from AGP.
21 | ndkVersion = '21.4.7075529'
22 | }
23 | }
24 | repositories {
25 | google()
26 | mavenCentral()
27 | }
28 | dependencies {
29 | classpath('com.android.tools.build:gradle:7.1.1')
30 | classpath('com.facebook.react:react-native-gradle-plugin')
31 | classpath('de.undercouch:gradle-download-task:5.0.1')
32 | // NOTE: Do not place your application dependencies here; they belong
33 | // in the individual module build.gradle files
34 | }
35 | }
36 |
37 | allprojects {
38 | repositories {
39 | mavenLocal()
40 | maven {
41 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
42 | url(new File(['node', '--print', "require.resolve('react-native/package.json')"].execute(null, rootDir).text.trim(), '../android'))
43 | }
44 | maven {
45 | // Android JSC is installed from npm
46 | url(new File(['node', '--print', "require.resolve('jsc-android/package.json')"].execute(null, rootDir).text.trim(), '../dist'))
47 | }
48 |
49 | google()
50 | mavenCentral {
51 | // We don't want to fetch react-native from Maven Central as there are
52 | // older versions over there.
53 | content {
54 | excludeGroup 'com.facebook.react'
55 | }
56 | }
57 | maven { url 'https://www.jitpack.io' }
58 | }
59 | }
60 |
--------------------------------------------------------------------------------
/src/screens/Tab/Settings/Settings.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { TouchableOpacity } from 'react-native';
3 | import { useTheme } from 'styled-components/native';
4 | import { SignOut } from 'phosphor-react-native';
5 | import { useNavigation } from '@react-navigation/native';
6 |
7 | import { Header } from '../../../components/Header';
8 | import { Profile } from '../../../components/Profile';
9 | import {
10 | Container,
11 | ViewFooter,
12 | TitleFooter,
13 | ViewIconButton
14 | } from './styles';
15 |
16 | export const Settings = () => {
17 | const { COLORS } = useTheme();
18 | const navigation = useNavigation();
19 |
20 | const handleGoPerfilUser = () => {
21 | navigation.navigate('Profile');
22 | }
23 |
24 | return (
25 | <>
26 |
27 |
28 |
29 |
35 |
36 | { }}
41 | />
42 |
43 | { }}
48 | />
49 |
50 | { }}
55 | />
56 |
57 | { }}
62 | />
63 |
64 |
65 |
66 |
67 |
72 |
73 |
74 | Sair da Wallet
75 |
76 |
77 | >
78 | )
79 | }
--------------------------------------------------------------------------------
/documentacao.md:
--------------------------------------------------------------------------------
1 | # GitHub
2 |
3 | Nome da Organização: Sam Agenda
4 | Nome do Repositório: sam-agenda
5 | Descrição: Agenda do comercio de Vilhena
6 | Linguagem: Node Js, Typescript
7 | URL: www.samagenda.com.br
8 | URL do Repositório:
9 | URL do Repositório no GitHub:
10 |
11 | # Ferramentas para deploy do Back-End:
12 |
13 | Render: Ferramentas para subir servidor backend e deixar online.
14 | Url: www.render.com
15 | ORM: Prisma
16 | Framework: Express
17 | Banco de Dados: PostgresSQL
18 |
19 | # Configuração a realizar no projeto;
20 |
21 | Terminar de configurar script start:dev: -r --exit-child -respawn
22 |
23 | # Comando GitHub
24 |
25 | npm init -y
26 | yarn add typescript -D
27 | yarn add @types/node -D
28 | yarn add @types/express -D
29 | yarn add @types/body-parser -D
30 | yarn add @types/mongoose -D
31 | yarn add @types/morgan -D
32 | yarn add @types/cors -D
33 | yarn add @types/jwt -D
34 | yarn add @types/bcryptjs -D
35 | yarn add @types/jsonwebtoken -D
36 | yarn add @types/moment -D
37 | yarn add @types/request-promise -D
38 | yarn add @types/winston -D
39 | yarn add @types/winston-mongodb -D
40 |
41 | # Subir código para GitHub pela primeira vez;
42 |
43 | 1 - git init
44 | 2 - git add .
45 | 3 - git commit -m "feat: Criação inicial da API"
46 | 4 - git branch -M main
47 | 5 - git remote add origin 'endereço do repositório'
48 | 6 - git push -u origin main
49 |
50 | # Criar um commit no GitHub;
51 |
52 | 1 - git add .
53 | # Adiciona as mudanças feito no projeto;
54 | 2 - git commit -m "feat: Criação inicial da API"
55 | # Nome do commit e comenta as o que voce fez;
56 | 3 - git push
57 | # Enviar para GitHub
58 | 4 - git pull
59 | # Buscar atualizações no GitHub referente ao projeto;
60 |
61 | # Trabalhando com branch main e develop no GitHub;
62 |
63 | 1 - git push origin main:develop
64 | 2 - git checkout develop
65 | 3 - git checkout -b feature/new-feature
66 | 3 - yarn install
67 |
68 | # Realizar um merge para o branch main;
69 |
70 | 1 - git checkout main
71 | 2 - git merge develop # nome da branch
72 | 3 - git merge --abort # para cancelar o merge
73 | 4 - git add .
74 | 5 - git commit -m "feat: fusão das branch develop e main"
75 |
76 |
77 | # Documentação Input
78 |
79 | * leftIcon: Ele serve para ancorar ícone na esquerda;
80 | * rightIcon: Ele serve para ancorar ícone na direita;
81 | * secureTextEntry: Serve para colocar typo de password;
82 | * secureTextEntry={false}: Serve para tirar o type de password;
--------------------------------------------------------------------------------
/src/screens/App/Profile/Profile.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { TouchableOpacity } from 'react-native';
3 | import { useTheme } from 'styled-components/native';
4 | import { Pen, Trash } from 'phosphor-react-native';
5 |
6 | import { Profile as ComponentProfile } from '../../../components/Profile';
7 | import { GoBack } from '../../../components/GoBack';
8 | import {
9 | Container,
10 | Header,
11 | Content,
12 | Footer,
13 | Avatar,
14 | ViewHeader,
15 | HeaderName,
16 | IconButton,
17 | ViewFooter,
18 | TitleFooter,
19 | ViewIconButton,
20 | } from './styles';
21 |
22 | export const Profile = () => {
23 | const { COLORS } = useTheme();
24 |
25 | return (
26 | <>
27 |
28 |
29 |
30 |
35 |
36 | Silvanei
37 |
38 |
43 |
44 |
45 |
46 |
47 | { }}
50 | />
51 | { }}
54 | />
55 | { }}
58 | />
59 | { }}
62 | />
63 |
64 |
78 |
79 | >
80 | )
81 | }
--------------------------------------------------------------------------------
/android/gradlew.bat:
--------------------------------------------------------------------------------
1 | @rem
2 | @rem Copyright 2015 the original author or authors.
3 | @rem
4 | @rem Licensed under the Apache License, Version 2.0 (the "License");
5 | @rem you may not use this file except in compliance with the License.
6 | @rem You may obtain a copy of the License at
7 | @rem
8 | @rem https://www.apache.org/licenses/LICENSE-2.0
9 | @rem
10 | @rem Unless required by applicable law or agreed to in writing, software
11 | @rem distributed under the License is distributed on an "AS IS" BASIS,
12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 | @rem See the License for the specific language governing permissions and
14 | @rem limitations under the License.
15 | @rem
16 |
17 | @if "%DEBUG%" == "" @echo off
18 | @rem ##########################################################################
19 | @rem
20 | @rem Gradle startup script for Windows
21 | @rem
22 | @rem ##########################################################################
23 |
24 | @rem Set local scope for the variables with windows NT shell
25 | if "%OS%"=="Windows_NT" setlocal
26 |
27 | set DIRNAME=%~dp0
28 | if "%DIRNAME%" == "" set DIRNAME=.
29 | set APP_BASE_NAME=%~n0
30 | set APP_HOME=%DIRNAME%
31 |
32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34 |
35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37 |
38 | @rem Find java.exe
39 | if defined JAVA_HOME goto findJavaFromJavaHome
40 |
41 | set JAVA_EXE=java.exe
42 | %JAVA_EXE% -version >NUL 2>&1
43 | if "%ERRORLEVEL%" == "0" goto execute
44 |
45 | echo.
46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47 | echo.
48 | echo Please set the JAVA_HOME variable in your environment to match the
49 | echo location of your Java installation.
50 |
51 | goto fail
52 |
53 | :findJavaFromJavaHome
54 | set JAVA_HOME=%JAVA_HOME:"=%
55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56 |
57 | if exist "%JAVA_EXE%" goto execute
58 |
59 | echo.
60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61 | echo.
62 | echo Please set the JAVA_HOME variable in your environment to match the
63 | echo location of your Java installation.
64 |
65 | goto fail
66 |
67 | :execute
68 | @rem Setup the command line
69 |
70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71 |
72 |
73 | @rem Execute Gradle
74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75 |
76 | :end
77 | @rem End local scope for the variables with windows NT shell
78 | if "%ERRORLEVEL%"=="0" goto mainEnd
79 |
80 | :fail
81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82 | rem the _cmd.exe /c_ return code!
83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84 | exit /b 1
85 |
86 | :mainEnd
87 | if "%OS%"=="Windows_NT" endlocal
88 |
89 | :omega
90 |
--------------------------------------------------------------------------------
/src/screens/Tab/Relatorio/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from "styled-components/native";
2 |
3 | export const Container = styled.View`
4 | flex: 1;
5 | /* padding: 15px; */
6 | `;
7 |
8 | export const BalanceImage = styled.ImageBackground`
9 | width: 100%;
10 | height: 215px;
11 | `;
12 |
13 | export const AmountValue = styled.Text`
14 | font-size: 11px;
15 | top: 60px;
16 | left: 160px;
17 | position: absolute;
18 | color: ${({ theme }) => theme.COLORS.WHITE};
19 | font-family: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
20 | `;
21 |
22 | export const ViewContent = styled.View`
23 | padding: 30px;
24 | align-items: center;
25 | justify-content: center;
26 | `;
27 |
28 | export const TitleAmount = styled.Text`
29 | font-size: 16px;
30 | line-height: 20px;
31 | color: ${({ theme }) => theme.COLORS.GRAY3};
32 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
33 | `;
34 |
35 | export const ValorTatal = styled.Text`
36 | font-size: 30px;
37 | line-height: 42px;
38 | color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
39 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
40 | `;
41 |
42 |
43 | export const Footer = styled.View`
44 | flex: 1;
45 | `;
46 |
47 | export const ContentFlat = styled.View`
48 | padding: 5px;
49 | margin-right: 10px;
50 | flex-direction: row;
51 | `;
52 |
53 | export const ContentFlatHeader = styled.View`
54 | flex-direction: row;
55 | align-items: center;
56 | padding: 20px;
57 | justify-content: space-between;
58 | `;
59 |
60 | export const Title = styled.Text`
61 | font-size: 20px;
62 | margin-left: 13px;
63 | color: ${({ theme }) => theme.COLORS.GRAY1};
64 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
65 | `;
66 |
67 | export const ButtonVerTotos = styled.TouchableOpacity`
68 | padding: 3px;
69 | border-width: 1px;
70 | border-radius: 30px;
71 | border-color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
72 | `;
73 |
74 | export const ButtonTitleVertotos = styled.Text`
75 | font-size: 12px;
76 | color: ${({ theme }) => theme.COLORS.PURPLEDARK1};
77 | font-family: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
78 | `;
79 |
80 | export const IconTransaction = styled.Image`
81 | width: 60px;
82 | height: 60px;
83 | `;
84 |
85 | export const DetailsTransaction = styled.View`
86 | flex: 1;
87 | `;
88 |
89 | export const NameTransaction = styled.Text`
90 | font-weight: 900;
91 | font-size: 16px;
92 | color: ${({ theme }) => theme.COLORS.GRAY1};
93 | font-weight: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
94 | `;
95 |
96 | export const SubtTitleTransaction = styled.Text`
97 | font-size: 14px;
98 | color: ${({ theme }) => theme.COLORS.GRAY4};
99 | font-weight: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
100 | `;
101 |
102 | export const AmountTransaction = styled.Text`
103 | font-weight: 900;
104 | font-size: 16px;
105 | color: ${({ theme }) => theme.COLORS.GRAY1};
106 | font-weight: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
107 | `;
--------------------------------------------------------------------------------
/src/screens/Tab/Relatorio/Relatorio.tsx:
--------------------------------------------------------------------------------
1 |
2 | import React from 'react';
3 | import { View, Text, FlatList } from 'react-native';
4 | import { useNavigation } from '@react-navigation/native';
5 |
6 | import { Header } from '../../../components/Header';
7 | import BalancePng from '../../../assets/estatistica.png'
8 | import { limited_transaction } from '../../../utils/limited_transaction';
9 | import {
10 | Container,
11 | AmountValue,
12 | BalanceImage,
13 | ViewContent,
14 | TitleAmount,
15 | ValorTatal,
16 | Footer,
17 | ContentFlat,
18 | ContentFlatHeader,
19 | Title,
20 | ButtonVerTotos,
21 | ButtonTitleVertotos,
22 | IconTransaction,
23 | DetailsTransaction,
24 | NameTransaction,
25 | SubtTitleTransaction,
26 | AmountTransaction,
27 | } from './styles';
28 |
29 | export const Relatorio = () => {
30 | const navigation = useNavigation();
31 |
32 | const handleGoTransaction = () => {
33 | navigation.navigate('Transaction')
34 | }
35 |
36 | return (
37 | <>
38 |
43 |
44 |
48 | R$ 500,00
49 |
50 |
51 |
52 | Valor Taltal
53 | R$ 10.000,00
54 |
55 |
56 |
84 |
85 | >
86 | )
87 | }
--------------------------------------------------------------------------------
/android/app/src/main/java/com/walletapp/MainActivity.java:
--------------------------------------------------------------------------------
1 | package com.walletapp;
2 |
3 | import android.os.Build;
4 | import android.os.Bundle;
5 |
6 | import com.facebook.react.ReactActivity;
7 | import com.facebook.react.ReactActivityDelegate;
8 | import com.facebook.react.ReactRootView;
9 |
10 | import expo.modules.ReactActivityDelegateWrapper;
11 |
12 | public class MainActivity extends ReactActivity {
13 | @Override
14 | protected void onCreate(Bundle savedInstanceState) {
15 | // Set the theme to AppTheme BEFORE onCreate to support
16 | // coloring the background, status bar, and navigation bar.
17 | // This is required for expo-splash-screen.
18 | setTheme(R.style.AppTheme);
19 | super.onCreate(null);
20 | }
21 |
22 | /**
23 | * Returns the name of the main component registered from JavaScript.
24 | * This is used to schedule rendering of the component.
25 | */
26 | @Override
27 | protected String getMainComponentName() {
28 | return "main";
29 | }
30 |
31 | /**
32 | * Returns the instance of the {@link ReactActivityDelegate}. There the RootView is created and
33 | * you can specify the renderer you wish to use - the new renderer (Fabric) or the old renderer
34 | * (Paper).
35 | */
36 | @Override
37 | protected ReactActivityDelegate createReactActivityDelegate() {
38 | return new ReactActivityDelegateWrapper(this, BuildConfig.IS_NEW_ARCHITECTURE_ENABLED,
39 | new MainActivityDelegate(this, getMainComponentName())
40 | );
41 | }
42 |
43 | /**
44 | * Align the back button behavior with Android S
45 | * where moving root activities to background instead of finishing activities.
46 | * @see onBackPressed
47 | */
48 | @Override
49 | public void invokeDefaultOnBackPressed() {
50 | if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
51 | if (!moveTaskToBack(false)) {
52 | // For non-root activities, use the default implementation to finish them.
53 | super.invokeDefaultOnBackPressed();
54 | }
55 | return;
56 | }
57 |
58 | // Use the default back button implementation on Android S
59 | // because it's doing more than {@link Activity#moveTaskToBack} in fact.
60 | super.invokeDefaultOnBackPressed();
61 | }
62 |
63 | public static class MainActivityDelegate extends ReactActivityDelegate {
64 | public MainActivityDelegate(ReactActivity activity, String mainComponentName) {
65 | super(activity, mainComponentName);
66 | }
67 |
68 | @Override
69 | protected ReactRootView createRootView() {
70 | ReactRootView reactRootView = new ReactRootView(getContext());
71 | // If you opted-in for the New Architecture, we enable the Fabric Renderer.
72 | reactRootView.setIsFabric(BuildConfig.IS_NEW_ARCHITECTURE_ENABLED);
73 | return reactRootView;
74 | }
75 |
76 | @Override
77 | protected boolean isConcurrentRootEnabled() {
78 | // If you opted-in for the New Architecture, we enable Concurrent Root (i.e. React 18).
79 | // More on this on https://reactjs.org/blog/2022/03/29/react-v18.html
80 | return BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
81 | }
82 | }
83 | }
84 |
--------------------------------------------------------------------------------
/src/components/ButtonPersonalizado/variants.ts:
--------------------------------------------------------------------------------
1 | import theme from '../../styles/theme';
2 |
3 | interface ButtonStyle {
4 | button: {
5 | backgroundColor: string;
6 | borderWidth?: number;
7 | borderColor?: string;
8 | };
9 | title: {
10 | color: string;
11 | fontSize?: number,
12 | };
13 | icon: {
14 | color: string;
15 | };
16 | }
17 |
18 | export interface ButtonVariant {
19 | enabled: ButtonStyle;
20 | disabled: ButtonStyle;
21 | }
22 |
23 | const buttonPrimary: ButtonVariant = {
24 | enabled: {
25 | button: {
26 | backgroundColor: theme.COLORS.PRIMARY,
27 | },
28 | title: {
29 | color: theme.COLORS.WHITE,
30 | },
31 | icon: {
32 | color: theme.COLORS.WHITE,
33 | },
34 | },
35 | disabled: {
36 | button: {
37 | backgroundColor: theme.COLORS.GRAY_100,
38 | },
39 | title: {
40 | color: theme.COLORS.WHITE,
41 | },
42 | icon: {
43 | color: theme.COLORS.WHITE,
44 | },
45 | },
46 | }
47 |
48 | const buttonOutLine: ButtonVariant = {
49 | enabled: {
50 | button: {
51 | borderWidth: 2,
52 | borderColor: theme.COLORS.PRIMARY,
53 | backgroundColor: 'transparent',
54 | },
55 | title: {
56 | color: theme.COLORS.GRAY1,
57 | },
58 | icon: {
59 | color: theme.COLORS.GRAY1,
60 | },
61 | },
62 | disabled: {
63 | button: {
64 | borderWidth: 2,
65 | borderColor: theme.COLORS.PRIMARY,
66 | backgroundColor: 'transparent',
67 | },
68 | title: {
69 | color: theme.COLORS.GREEN1,
70 | },
71 | icon: {
72 | color: theme.COLORS.GREEN1,
73 | },
74 | },
75 | }
76 |
77 | const buttonBlack: ButtonVariant = {
78 | enabled: {
79 | button: {
80 | backgroundColor: theme.COLORS.BLACK,
81 | },
82 | title: {
83 | color: theme.COLORS.WHITE,
84 | },
85 | icon: {
86 | color: theme.COLORS.WHITE,
87 | },
88 | },
89 | disabled: {
90 | button: {
91 | backgroundColor: theme.COLORS.GRAY_100,
92 | },
93 | title: {
94 | color: theme.COLORS.WHITE,
95 | },
96 | icon: {
97 | color: theme.COLORS.WHITE,
98 | },
99 | },
100 | };
101 |
102 | const buttonTransparent: ButtonVariant = {
103 | enabled: {
104 | button: {
105 | backgroundColor: 'transparent',
106 | },
107 | title: {
108 | color: theme.COLORS.GRAY2,
109 | fontSize: 17,
110 | },
111 | icon: {
112 | color: theme.COLORS.GRAY2,
113 | }
114 | },
115 | disabled: {
116 | button: {
117 | backgroundColor: 'transparent',
118 | },
119 | title: {
120 | color: theme.COLORS.GRAY2,
121 | fontSize: 17,
122 | },
123 | icon: {
124 | color: theme.COLORS.GRAY2,
125 | }
126 | }
127 | }
128 |
129 | export const variants = {
130 | primary: buttonPrimary,
131 | outline: buttonOutLine,
132 | black: buttonBlack,
133 | transparent: buttonTransparent,
134 | };
--------------------------------------------------------------------------------
/android/app/src/debug/java/com/walletapp/ReactNativeFlipper.java:
--------------------------------------------------------------------------------
1 | /**
2 | * Copyright (c) Facebook, Inc. and its affiliates.
3 | *
4 | * This source code is licensed under the MIT license found in the LICENSE file in the root
5 | * directory of this source tree.
6 | */
7 | package com.walletapp;
8 |
9 | import android.content.Context;
10 | import com.facebook.flipper.android.AndroidFlipperClient;
11 | import com.facebook.flipper.android.utils.FlipperUtils;
12 | import com.facebook.flipper.core.FlipperClient;
13 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin;
14 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin;
15 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin;
16 | import com.facebook.flipper.plugins.inspector.DescriptorMapping;
17 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin;
18 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor;
19 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin;
20 | import com.facebook.flipper.plugins.react.ReactFlipperPlugin;
21 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin;
22 | import com.facebook.react.ReactInstanceManager;
23 | import com.facebook.react.bridge.ReactContext;
24 | import com.facebook.react.modules.network.NetworkingModule;
25 | import okhttp3.OkHttpClient;
26 |
27 | public class ReactNativeFlipper {
28 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) {
29 | if (FlipperUtils.shouldEnableFlipper(context)) {
30 | final FlipperClient client = AndroidFlipperClient.getInstance(context);
31 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
32 | client.addPlugin(new ReactFlipperPlugin());
33 | client.addPlugin(new DatabasesFlipperPlugin(context));
34 | client.addPlugin(new SharedPreferencesFlipperPlugin(context));
35 | client.addPlugin(CrashReporterPlugin.getInstance());
36 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
37 | NetworkingModule.setCustomClientBuilder(
38 | new NetworkingModule.CustomClientBuilder() {
39 | @Override
40 | public void apply(OkHttpClient.Builder builder) {
41 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
42 | }
43 | });
44 | client.addPlugin(networkFlipperPlugin);
45 | client.start();
46 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
47 | // Hence we run if after all native modules have been initialized
48 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
49 | if (reactContext == null) {
50 | reactInstanceManager.addReactInstanceEventListener(
51 | new ReactInstanceManager.ReactInstanceEventListener() {
52 | @Override
53 | public void onReactContextInitialized(ReactContext reactContext) {
54 | reactInstanceManager.removeReactInstanceEventListener(this);
55 | reactContext.runOnNativeModulesQueueThread(
56 | new Runnable() {
57 | @Override
58 | public void run() {
59 | client.addPlugin(new FrescoFlipperPlugin());
60 | }
61 | });
62 | }
63 | });
64 | } else {
65 | client.addPlugin(new FrescoFlipperPlugin());
66 | }
67 | }
68 | }
69 | }
--------------------------------------------------------------------------------
/ios/walletapp.xcodeproj/xcshareddata/xcschemes/walletapp.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
53 |
55 |
61 |
62 |
63 |
64 |
70 |
72 |
78 |
79 |
80 |
81 |
83 |
84 |
87 |
88 |
89 |
--------------------------------------------------------------------------------
/src/screens/Auth/Cadastro/Cadastro.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { useTheme } from "styled-components/native";
3 | import { useNavigation } from '@react-navigation/native';
4 | import { KeyboardAvoidingView, ScrollView } from 'react-native';
5 |
6 | import Input from '../../../components/Input';
7 | import { ButtonPersonalizado } from "../../../components/ButtonPersonalizado";
8 | import {
9 | Container,
10 | ContentHeader,
11 | Title,
12 | Description,
13 | ContentBody,
14 | ContentFoooter,
15 | ButtonFooter,
16 | Title1,
17 | Title2,
18 | } from "./styles";
19 |
20 | export const Cadastro = () => {
21 | const { COLORS } = useTheme();
22 | const navigation = useNavigation();
23 |
24 | const handleVoltarLogin = () => {
25 | navigation.navigate('Login');
26 | }
27 |
28 | return (
29 | //
33 |
34 |
37 |
38 | Seja bem vindo {'\n'} a App Wallet
39 | CADASTRO
40 |
41 |
42 |
43 |
54 |
55 |
66 |
67 |
79 |
80 | { }}
83 | style={{
84 | marginTop: 50,
85 | }}
86 | />
87 |
88 |
89 |
90 |
91 | Já tem conta?
92 | Logar-se
93 |
94 |
95 |
96 |
97 | //
98 | );
99 | };
100 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 | APP MOBILE WALLET
3 |
4 | Versão: 1.0
5 |
6 |
7 |
8 | PROTÓTIPO DO CURSO
9 |
10 |
11 |
12 |
13 | 🚧 APLICAÇÃO MOBILE PARA ANDROID E IOS WALLET FINANCEIRA... 🚧
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 | 🚀 Você ira encontrar uma lista de funcionalidade do projeto que foi implementado. Vamos utilizar banco de dados na nuvem para gerenciar todas as informações geradas pelo sistema.📄
22 |
23 | ### Features
24 |
25 | - [X] Tela de Login;
26 | - [ ] Tela de Cadastro;
27 | - [ ] Tela de Recuperação de Senha;
28 | - [ ] Tela de Alteração de Senha;
29 | - [ ] Tela Home;
30 | - [ ] Tela Notificações;
31 | - [ ] Tela de Perfil de usuário;
32 | - [ ] Tela Cartões;
33 | - [ ] Tela de Detalhes do Cartão;
34 | - [ ] Tela de Status da Renda;
35 | - [ ] Tela de Transferência;
36 |
37 | ## ✅ Instrução para rodar o projeto na maquina local;
38 |
39 | Para realizar o clone o projeto em sua máquina, e necessário que tenha as seguintes ferramentas instalado em sua máquina `yarn` ou `npm`, `node js`, `expo`. para instalar as depenicas você tem que rodar o comando `yarn` e em seguida `yarn android` caso seja ANDROID para executar a aplicação ou `yarn ios` caso seja emulador IOS.
40 |
41 | Atualmente o projeto não necessita de nenhuma variável ambiente, então, é simples para você deixar o projeto em execução.
42 |
43 | ```bash
44 | # Clonar o repositório
45 | $ git clonehttps://github.com/SilvaneiMartins/wallet-app
46 |
47 | # Acessar a pasta do projeto
48 | $ cd wallet-app
49 |
50 | # Instalar as dependências
51 | $ yarn
52 | $ npm install
53 |
54 | # Executar a aplicação android
55 | $ npx react-native run-android
56 | $ yarn android
57 | $ expo start
58 |
59 | # Executar a aplicação no ios
60 | $ npx react-native ios-android
61 | $ yarn ios
62 | $ expo start
63 | ```
64 |
65 | ## :memo: License
66 |
67 | Este projeto está sob a licença MIT. Caso gostaria de ler, por favor acessar a licença aqui neste link [LICENSE](https://github.com/SilvaneiMartins/wallet-app/blob/master/LICENSE) para maiores informações.
68 |
69 | ---
70 |
71 | ## 🛠 Tecnologias usada no projeto;
72 |
73 | Aqui tem link de algumas das tecnologias utilizada no projeto.
74 |
75 | - [REACT](https://pt-br.reactjs.org)
76 | - [YUP](https://github.com/jquense/yup)
77 | - [REACT-NATIVE](https://reactnative.dev/)
78 | - [REDUX](https://github.com/reduxjs/redux)
79 | - [MOMENT](https://github.com/moment/moment)
80 | - [UNFORM](https://github.com/unform/unform)
81 | - [STYLED-COMPONENTS](https://styled-components.com/)
82 | - [REACT-NATIVE-VECTOR-ICONS](https://phosphoricons.com/)
83 |
84 |
85 | ### Observação Importante sobre o Projeto;
86 |
87 | - O projeto foi desenvolvido para Android e IOS, para que possa ser executado em qualquer plataforma, mas no momento vamos dar continuidade para Android é utilizar o sistema operacional windows.
88 |
89 | - Quando for adicionado ferramento ao projeto sera adicionado logo acima na sessão de Tecnologias usada no projeto.
90 |
91 | - Este README será utilizado como documentação para o projeto Wallet.
92 |
93 | ### Developer
94 |
95 | ---
96 |
97 |
98 |
104 |
105 |
106 | Silvanei de Almeida Martins
107 |
108 |
109 |
110 | 🚀
111 |
112 | Feito com ❤️ por Silvanei Martins
113 |
--------------------------------------------------------------------------------
/src/screens/Tab/Notificacao/Notificacao.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from 'react';
2 | import { FlatList } from 'react-native';
3 | import { useTheme } from 'styled-components/native';
4 | import { ArrowCircleUp } from 'phosphor-react-native';
5 |
6 | import { Header } from '../../../components/Header';
7 | import { new_notifications } from '../../../utils/new_notifications';
8 | import { ContentTop } from '../../../components/Notifications/ContentTop';
9 | import { recents_notifications } from '../../../utils/recent_notifications';
10 |
11 | import {
12 | Container,
13 | ContentBody,
14 | ContentFlat,
15 | ContentHeader,
16 | ContentTopTitle,
17 | ContentBodyTitle,
18 | DataNotifications,
19 | TitleNotifications,
20 | NewNotificationsFlat,
21 | DataNotificationsText,
22 | TitleNotificationsText,
23 | NewButtonNotifications,
24 | DescriptionNotifications,
25 | DescriptionNotificationsText,
26 | } from './styles';
27 |
28 | export const Notificacao = () => {
29 | const { COLORS } = useTheme();
30 |
31 | return (
32 | <>
33 |
38 |
39 |
40 | Novo
41 | (
44 |
49 | )}
50 | showsVerticalScrollIndicator={false}
51 | />
52 |
53 |
54 |
55 | Recentes
56 | item.id.toString()}
59 | renderItem={({ item }) => (
60 |
61 |
62 |
63 |
64 | {item.datetime}
65 |
66 |
67 |
68 |
69 |
70 | {item.title}
71 |
72 |
73 |
74 |
75 |
76 | {item.type}
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 | )}
86 | contentContainerStyle={{
87 | paddingBottom: 20
88 | }}
89 | showsVerticalScrollIndicator={false}
90 | />
91 |
92 |
93 | >
94 | )
95 | }
--------------------------------------------------------------------------------
/src/components/Input_old/Input.tsx:
--------------------------------------------------------------------------------
1 | import React, {
2 | useRef,
3 | useState,
4 | useEffect,
5 | forwardRef,
6 | useCallback,
7 | useImperativeHandle,
8 | } from "react";
9 | import { useField } from "@unform/core";
10 | import { useTheme } from "styled-components";
11 | import { Ionicons } from "@expo/vector-icons";
12 | import { TextInputProps } from "react-native";
13 |
14 | interface InputRef {
15 | focus(): void;
16 | }
17 |
18 | interface InputValueReference {
19 | value: string;
20 | }
21 |
22 | interface InputProps extends TextInputProps {
23 | name: string;
24 | value?: string;
25 | iconName: keyof typeof Ionicons.glyphMap;
26 | containerStyle?: { [key: string]: string | number };
27 | }
28 |
29 | import { Container, IConContainer, InputText } from "./styles";
30 |
31 | const Input: React.ForwardRefRenderFunction = (
32 | { iconName, name, value, containerStyle, ...rest },
33 | ref
34 | ) => {
35 | const theme = useTheme();
36 |
37 | const [hasError, setHasError] = useState(false);
38 | const [isFocused, setIsFocused] = useState(false);
39 | const [isFilled, setIsFilled] = useState(false);
40 |
41 | const {
42 | registerField,
43 | fieldName,
44 | defaultValue = "",
45 | error,
46 | } = useField(name);
47 | const inputElementRef = useRef(null);
48 | const inputValueRef = useRef({ value: defaultValue });
49 |
50 | useEffect(() => {
51 | setHasError(!!error);
52 | }, [error]);
53 |
54 | const handleFocus = useCallback(() => {
55 | setIsFocused(true);
56 | setHasError(false);
57 | }, []);
58 |
59 | const handleBlur = useCallback(() => {
60 | setIsFocused(false);
61 | setIsFilled(!!inputValueRef.current.value);
62 | }, []);
63 |
64 | useImperativeHandle(ref, () => ({
65 | focus() {
66 | inputElementRef.current.focus();
67 | },
68 | }));
69 |
70 | useEffect(() => {
71 | registerField({
72 | name: fieldName,
73 | ref: inputElementRef.current,
74 | path: "value",
75 | setValue(_, value) {
76 | inputValueRef.current.value = value;
77 | inputElementRef.current.setNativeProps({ text: value });
78 | },
79 | clearValue() {
80 | inputValueRef.current.value = "";
81 | inputElementRef.current.clear();
82 | },
83 | });
84 | }, [registerField, fieldName]);
85 |
86 | return (
87 |
88 |
93 | {iconName && (
94 |
103 | )}
104 |
105 |
106 | {
116 | inputValueRef.current.value = value;
117 | }}
118 | {...rest}
119 | />
120 |
121 | );
122 | };
123 |
124 | export default forwardRef(Input);
125 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/walletapp/MainApplication.java:
--------------------------------------------------------------------------------
1 | package com.walletapp;
2 |
3 | import android.app.Application;
4 | import android.content.Context;
5 | import android.content.res.Configuration;
6 | import androidx.annotation.NonNull;
7 |
8 | import com.facebook.react.PackageList;
9 | import com.facebook.react.ReactApplication;
10 | import com.facebook.react.ReactInstanceManager;
11 | import com.facebook.react.ReactNativeHost;
12 | import com.facebook.react.ReactPackage;
13 | import com.facebook.react.config.ReactFeatureFlags;
14 | import com.facebook.soloader.SoLoader;
15 | import com.walletapp.newarchitecture.MainApplicationReactNativeHost;
16 |
17 | import expo.modules.ApplicationLifecycleDispatcher;
18 | import expo.modules.ReactNativeHostWrapper;
19 |
20 | import java.lang.reflect.InvocationTargetException;
21 | import java.util.List;
22 |
23 | public class MainApplication extends Application implements ReactApplication {
24 | private final ReactNativeHost mReactNativeHost = new ReactNativeHostWrapper(
25 | this,
26 | new ReactNativeHost(this) {
27 | @Override
28 | public boolean getUseDeveloperSupport() {
29 | return BuildConfig.DEBUG;
30 | }
31 |
32 | @Override
33 | protected List getPackages() {
34 | @SuppressWarnings("UnnecessaryLocalVariable")
35 | List packages = new PackageList(this).getPackages();
36 | // Packages that cannot be autolinked yet can be added manually here, for example:
37 | // packages.add(new MyReactNativePackage());
38 | return packages;
39 | }
40 |
41 | @Override
42 | protected String getJSMainModuleName() {
43 | return "index";
44 | }
45 | });
46 |
47 | private final ReactNativeHost mNewArchitectureNativeHost =
48 | new ReactNativeHostWrapper(this, new MainApplicationReactNativeHost(this));
49 |
50 | @Override
51 | public ReactNativeHost getReactNativeHost() {
52 | if (BuildConfig.IS_NEW_ARCHITECTURE_ENABLED) {
53 | return mNewArchitectureNativeHost;
54 | } else {
55 | return mReactNativeHost;
56 | }
57 | }
58 |
59 | @Override
60 | public void onCreate() {
61 | super.onCreate();
62 | // If you opted-in for the New Architecture, we enable the TurboModule system
63 | ReactFeatureFlags.useTurboModules = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
64 | SoLoader.init(this, /* native exopackage */ false);
65 |
66 | initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
67 | ApplicationLifecycleDispatcher.onApplicationCreate(this);
68 | }
69 |
70 | @Override
71 | public void onConfigurationChanged(@NonNull Configuration newConfig) {
72 | super.onConfigurationChanged(newConfig);
73 | ApplicationLifecycleDispatcher.onConfigurationChanged(this, newConfig);
74 | }
75 |
76 | /**
77 | * Loads Flipper in React Native templates. Call this in the onCreate method with something like
78 | * initializeFlipper(this, getReactNativeHost().getReactInstanceManager());
79 | *
80 | * @param context
81 | * @param reactInstanceManager
82 | */
83 | private static void initializeFlipper(
84 | Context context, ReactInstanceManager reactInstanceManager) {
85 | if (BuildConfig.DEBUG) {
86 | try {
87 | /*
88 | We use reflection here to pick up the class that initializes Flipper,
89 | since Flipper library is not available in release mode
90 | */
91 | Class> aClass = Class.forName("com.walletapp.ReactNativeFlipper");
92 | aClass
93 | .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class)
94 | .invoke(null, context, reactInstanceManager);
95 | } catch (ClassNotFoundException e) {
96 | e.printStackTrace();
97 | } catch (NoSuchMethodException e) {
98 | e.printStackTrace();
99 | } catch (IllegalAccessException e) {
100 | e.printStackTrace();
101 | } catch (InvocationTargetException e) {
102 | e.printStackTrace();
103 | }
104 | }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/src/components/Profile/Profile.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { TouchableOpacity } from 'react-native';
3 | import { useTheme } from 'styled-components/native';
4 | import { useNavigation } from '@react-navigation/native';
5 | import {
6 | User,
7 | CaretRight,
8 | BellSimple,
9 | Wallet,
10 | Password,
11 | PhoneCall,
12 | } from "phosphor-react-native";
13 |
14 | import {
15 | Container,
16 | ViewProfile,
17 | ProfileName,
18 | ViewRight,
19 | ViewIcon,
20 | } from './styles';
21 |
22 | interface IProfile {
23 | name: string;
24 | iconLeft?: boolean;
25 | iconRight?: boolean;
26 | typeUser?: boolean;
27 | typeNotification?: boolean;
28 | typeWalet?: boolean;
29 | typeLogin?: boolean;
30 | typeCall?: boolean;
31 | onPress: () => void;
32 | }
33 |
34 | export const Profile = ({
35 | name,
36 | iconLeft,
37 | iconRight,
38 | typeCall,
39 | typeLogin,
40 | typeNotification,
41 | typeUser,
42 | typeWalet,
43 | onPress,
44 | }: IProfile) => {
45 | const { COLORS } = useTheme();
46 |
47 | const navigation = useNavigation();
48 |
49 | return (
50 | <>
51 |
52 |
53 | {iconLeft && (
54 | <>
55 | {typeUser && (
56 |
57 |
62 |
63 | )}
64 | {typeNotification && (
65 |
66 |
71 |
72 | )}
73 | {typeWalet && (
74 |
75 |
80 |
81 | )}
82 | {typeLogin && (
83 |
84 |
89 |
90 | )}
91 | {typeCall && (
92 |
93 |
98 |
99 | )}
100 | >
101 | )}
102 |
103 | {name}
104 |
105 |
110 |
111 |
112 |
113 |
114 | >
115 | )
116 | }
--------------------------------------------------------------------------------
/src/styles/theme.ts:
--------------------------------------------------------------------------------
1 | export default {
2 | COLORS: {
3 | TEXT: '#969CB2',
4 | GRAY: '#999591',
5 | BLACK: '#100C08',
6 | GRAY_100: '#B8B8B8',
7 | ICON: '#666666',
8 | WHITE: '#FFFFFF',
9 | TITLE: '#363F5F',
10 | SHAPE: '#f4ede8',
11 | PRIMARY: '#1DC18B',
12 | GRAYHARD: '#666360',
13 | TEXTDARK: '#000000',
14 | WHITE_100: '#FFFFFF',
15 |
16 | RED: '#EB5757',
17 | ORANGE_300: '#fbb605',
18 | ORANGE: '#F2994A',
19 | YELLOW: '#F2C94C',
20 | GREEN3: '#6FCF97',
21 | GREEN2: '#27AE60',
22 | GREEN1: '#219653',
23 | BLUE3: '#56CCF2',
24 | BLUE2: '#2D9CDB',
25 | BLUE1: '#2F80ED',
26 | BLUE: '#4368C7',
27 | GRAY6: '#F2F2F2',
28 | GRAY5: '#E0E0E0',
29 | GRAY4: '#BDBDBD',
30 | GRAY3: '#828282',
31 | GRAY2: '#4F4F4F',
32 | GRAY1: '#333333',
33 |
34 | PINK: '#D71CDB',
35 | PURPLE2: '#BB6BD9',
36 | PURPLE1: '#9B51E0',
37 | PURPLE: '#9038FF',
38 | PURPLEDARK1: '#6E34B8',
39 | PURPLEDARK2: '#5B259F',
40 | PURPLEDARK3: '#2F1155',
41 | PURPLE_CARD: "#5B259F",
42 | PURPLE_ELIPSE_ONE: "#6E34B8",
43 | PURPLE_ELIPSE_TWO: "#9038FF",
44 | PURPLE_TEXT: '#130138',
45 |
46 | TONE: '#E6E3D6',
47 | AVATAR: '#E0E0E0',
48 | BORDER: '#DEDCD3',
49 | SPEACH: '#D5CFB9',
50 | SPEACH200: '#bab49f',
51 | SPEACH300: '#b7ad87',
52 | SPEACH400: '#aea997',
53 | SPEACH500: '#928b72',
54 | SPEACH600: '#888577',
55 | INFORMATIVO: '#F3B263',
56 |
57 | TYPOTIME: '#6E664E',
58 | TYPOGHOST: '#999999',
59 | TYPOBrand: '#55AB67',
60 | TYPOSOCIAL: '#5B75A6',
61 | TYPOPRIMARY: '#000000',
62 | TYPOSECONDARY: '#333333',
63 |
64 | TONEBG: '#E6E3D6',
65 | TONEYPE: '#6E664E',
66 | TONE1829: '#f3ebd9',
67 | TONESTO: '#e4daca',
68 | TONEPAINT: '#f2d9be',
69 | TONEGLIDDEN: '#e7e3d6',
70 | TONEOLYMPIC: '#ede3d6',
71 | TONEPANTONE: '#f0e4d7',
72 | TONECAPAROL: '#e4d8d0',
73 | TONEBRISTOL: '#ecddc9',
74 | TONEMATTNEWS: '#f2d9be',
75 | TONEHOMEBASE: '#f0e9d9',
76 |
77 | BACKGROUND: '#E5E5E5',
78 | BACKGROUNDDARK: '#312e38',
79 | BACKGROUNDLIGHT: '#FFFFFF',
80 | BACKGROUNDOFICIAL: '#F2EFE5',
81 | BACKGROUNDDEFAULT: '#F1EFE5',
82 |
83 | SECONDARY: '#FF872C',
84 | SECONDARY_LIGHT: 'rgba(255, 135, 44, 0.3)',
85 | SECONDARY_LIGHT4: 'rgba(255, 135, 44, 0.4)',
86 | SECONDARY_LIGHT2: 'rgba(255, 135, 44, 0.2)',
87 | SECONDARY_LIGHT1: 'rgba(255, 135, 44, 0.1)',
88 |
89 | SUCCESS: '#12A454',
90 | SUCCESS_LIGHT: 'rgba(18, 164, 84, 0.5)',
91 | SUCCESS_LIGHT1: 'rgba(18, 164, 84, 0.1)',
92 | SUCCESS_LIGHT2: 'rgba(18, 164, 84, 0.2)',
93 | SUCCESS_LIGHT3: 'rgba(18, 164, 84, 0.3)',
94 | SUCCESS_LIGHT4: 'rgba(18, 164, 84, 0.4)',
95 | SUCCESS_LIGHT5: 'rgba(18, 164, 84, 0.5)',
96 | SUCCESS_LIGHT6: 'rgba(18, 164, 84, 0.6)',
97 | SUCCESS_LIGHT7: 'rgba(18, 164, 84, 0.7)',
98 | SUCCESS_LIGHT8: 'rgba(18, 164, 84, 0.8)',
99 | SUCCESS_LIGHT9: 'rgba(18, 164, 84, 0.9)',
100 |
101 | ATTENTION: '#E83F5B',
102 | ATTENTION_LIGHT1: 'rgba(232, 63, 91, 0.1)',
103 | ATTENTION_LIGHT2: 'rgba(232, 63, 91, 0.2)',
104 | ATTENTION_LIGHT3: 'rgba(232, 63, 91, 0.3)',
105 | ATTENTION_LIGHT4: 'rgba(232, 63, 91, 0.4)',
106 | ATTENTION_LIGHT: 'rgba(232, 63, 91, 0.5)',
107 | ATTENTION_LIGHT6: 'rgba(232, 63, 91, 0.6)',
108 | ATTENTION_LIGHT7: 'rgba(232, 63, 91, 0.7)',
109 | ATTENTION_LIGHT8: 'rgba(232, 63, 91, 0.8)',
110 | ATTENTION_LIGHT9: 'rgba(232, 63, 91, 0.9)',
111 | },
112 |
113 | FONTS: {
114 | TEXT: 'DMSans_400Regular',
115 | POPPINSBOLD: 'Poppins_700Bold',
116 | POPPINSLIGHT: 'Poppins_300Light',
117 | POPPINSMEDIUM: 'Poppins_500Medium',
118 | TITLE: 'DMSerifDisplay_400Regular',
119 | POPPINSREGULAR: 'Poppins_400Regular',
120 | POPPINSEXTRABOLD: 'Poppins_800ExtraBold',
121 | },
122 | };
123 |
--------------------------------------------------------------------------------
/src/screens/Auth/Login/Login.tsx:
--------------------------------------------------------------------------------
1 | import React, { useState } from "react";
2 | import { useTheme } from "styled-components";
3 | import { KeyboardAvoidingView, ScrollView } from "react-native";
4 | import { useNavigation } from "@react-navigation/native";
5 |
6 | import Input from "../../../components/Input/Input";
7 | import { ButtonSocial } from "../../../components/ButtonSocial/ButtonSocial";
8 | import { ButtonPersonalizado } from "../../../components/ButtonPersonalizado";
9 | import { ButtonSocialGoogle } from "../../../components/ButtonSocialGoogle/ButtonSocialGoogle";
10 | import {
11 | Container,
12 | ContentHeader,
13 | ContentBody,
14 | ContentFooter,
15 | Title,
16 | Description,
17 | ViewButton,
18 | ButtonSignUp,
19 | TitleButtonSignUp1,
20 | TitleButtonSingUp2,
21 | ContentForgotPassword,
22 | ContentButtonForgotPassword,
23 | ContentTitleForgotPassword,
24 | } from "./styles";
25 |
26 | export const Login = () => {
27 | const { COLORS } = useTheme();
28 | const [loading, setLoading] = useState(false);
29 | const navigation = useNavigation()
30 |
31 | function onPressButton() {
32 | setLoading(true);
33 | console.log("pressionado");
34 | setTimeout(() => {
35 | setLoading(false);
36 | }, 2000);
37 | }
38 |
39 | const handleCadastro = () => {
40 | navigation.navigate('Cadastro');
41 | }
42 |
43 | const handleRecuperarSenha = () => {
44 | navigation.navigate('RecuperarSenha');
45 | }
46 |
47 | return (
48 | //
52 |
53 |
54 |
55 | Seja bem vindo(a) {"\n"} a App Carteira
56 | Entrar com rede sociais
57 |
58 |
59 |
60 |
61 |
62 |
63 |
73 |
84 |
85 |
86 | Recuperar Senha
87 |
88 |
89 | {}}
93 | style={{ marginBottom: 20 }}
94 | />
95 |
96 |
97 |
98 |
99 | Não tem cadastro ainda?
100 | Cadastre-se
101 |
102 |
103 |
104 |
105 |
106 | //
107 | );
108 | };
109 |
--------------------------------------------------------------------------------
/ios/walletapp/SplashScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
31 |
39 |
40 |
41 |
42 |
53 |
54 |
55 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/src/screens/Tab/Carteira/Carteira.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { useNavigation } from '@react-navigation/native';
3 | import { View, Text, TouchableOpacity, FlatList } from 'react-native';
4 |
5 | import Payments from '../../../assets/export.png';
6 | import Transfer from '../../../assets/convert.png';
7 | import TopUp from '../../../assets/add-circle.png';
8 | import PayOut from '../../../assets/money-send.png';
9 | import EllipseOnePng from '../../../assets/ellipse1.png';
10 | import EllipseTwoPng from '../../../assets/ellipse2.png';
11 | import { Header } from '../../../components/Header/Header';
12 | import { limited_transaction } from "../../../utils/limited_transaction";
13 | import {
14 | Container,
15 | Content,
16 | ViewContainer,
17 | ViewBalanceLeft,
18 | ViewBalanceRight,
19 | TitleValor,
20 | TitleValoConta,
21 | TitleCartao,
22 | TitleNomeCartao,
23 | Body,
24 | IconPayment,
25 | IconTransfer,
26 | IconPayOut,
27 | IconTopUp,
28 | TitleTransfer,
29 | TitlePayments,
30 | TitlePayOut,
31 | TitleTopUp,
32 | Footer,
33 | ContentFlat,
34 | ContentFlatHeader,
35 | Title,
36 | ButtonVerTotos,
37 | ButtonTitleVertotos,
38 | IconTransaction,
39 | DetailsTransaction,
40 | NameTransaction,
41 | SubtTitleTransaction,
42 | AmountTransaction,
43 | EllipseOne,
44 | EllipseTwo,
45 | } from './styles';
46 |
47 | export const Carteira = () => {
48 | const navigation = useNavigation();
49 |
50 | const hadleGoTransaction = () => {
51 | navigation.navigate('Transaction')
52 | }
53 |
54 | return (
55 |
56 |
61 |
62 |
63 |
64 |
65 |
66 | Valor Total
67 | R$ 1.000,00
68 |
69 |
70 |
71 | Cartão
72 | Wallet
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 | Transf.
81 |
82 |
83 |
84 | Forma Pagto
85 |
86 |
87 |
88 | Pagtos
89 |
90 | navigation.navigate('AddCartao')}
92 | style={{ alignItems: 'center' }}
93 | >
94 |
95 | Add Cartão
96 |
97 |
98 |
99 |
100 |
128 |
129 | )
130 | }
--------------------------------------------------------------------------------
/src/screens/Tab/Carteira/styles.ts:
--------------------------------------------------------------------------------
1 | import styled from "styled-components/native";
2 |
3 | export const Container = styled.View`
4 | flex: 1;
5 | `;
6 |
7 | export const ViewContainer = styled.View`
8 | padding: 0 30px;
9 | align-items: center;
10 | justify-content: center;
11 | `;
12 |
13 | export const Content = styled.View`
14 | width: 100%;
15 | height: 160px;
16 | flex-direction: row;
17 | border-radius: 50px;
18 | align-items: center;
19 | justify-content: space-around;
20 | background-color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
21 | `;
22 |
23 | export const EllipseOne = styled.Image`
24 | top: 1px;
25 | left: 40px;
26 | position: absolute;
27 | `;
28 |
29 | export const EllipseTwo = styled.Image`
30 | right: 0;
31 | bottom: 0;
32 | position: absolute;
33 | `;
34 |
35 | export const ViewBalanceLeft = styled.View``;
36 |
37 | export const ViewBalanceRight = styled.View`
38 | z-index: 1;
39 | `;
40 |
41 | export const TitleValor = styled.Text`
42 | font-size: 16px;
43 | color: ${({ theme }) => theme.COLORS.WHITE};
44 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
45 | `;
46 |
47 | export const TitleValoConta = styled.Text`
48 | font-size: 20px;
49 | color: ${({ theme }) => theme.COLORS.WHITE};
50 | font-family: ${({ theme }) => theme.FONTS.POPPINSEXTRABOLD};
51 | `;
52 |
53 | export const TitleCartao = styled.Text`
54 | font-size: 16px;
55 | color: ${({ theme }) => theme.COLORS.WHITE};
56 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
57 | `;
58 |
59 | export const TitleNomeCartao = styled.Text`
60 | font-size: 20px;
61 | color: ${({ theme }) => theme.COLORS.WHITE};
62 | font-family: ${({ theme }) => theme.FONTS.POPPINSEXTRABOLD};
63 | `;
64 |
65 | export const Body = styled.View`
66 | width: 100%;
67 | padding: 10px;
68 | margin-top: 20px;
69 | align-items: center;
70 | flex-direction: row;
71 | justify-content: space-between;
72 | `;
73 |
74 | export const IconPayment = styled.Image`
75 | width: 70px;
76 | height: 70px;
77 | `;
78 |
79 | export const IconTransfer = styled.Image`
80 | width: 70px;
81 | height: 70px;
82 | `;
83 |
84 | export const IconPayOut = styled.Image`
85 | width: 70px;
86 | height: 70px;
87 | `;
88 |
89 | export const IconTopUp = styled.Image`
90 | width: 70px;
91 | height: 70px;
92 | `;
93 |
94 | export const TitleTransfer = styled.Text`
95 | font-size: 13px;
96 | color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
97 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
98 | `;
99 |
100 | export const TitlePayments = styled.Text`
101 | font-size: 13px;
102 | color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
103 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
104 | `;
105 |
106 | export const TitlePayOut = styled.Text`
107 | font-size: 13px;
108 | color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
109 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
110 | `;
111 |
112 | export const TitleTopUp = styled.Text`
113 | font-size: 13px;
114 | color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
115 | font-family: ${({ theme }) => theme.FONTS.POPPINSMEDIUM};
116 | `;
117 |
118 | export const Footer = styled.View`
119 | flex: 1;
120 | `;
121 |
122 | export const ContentFlat = styled.View`
123 | padding: 5px 20px;
124 | flex-direction: row;
125 | `;
126 |
127 | export const ContentFlatHeader = styled.View`
128 | flex-direction: row;
129 | align-items: center;
130 | padding: 20px;
131 | justify-content: space-between;
132 | `;
133 |
134 | export const Title = styled.Text`
135 | font-size: 20px;
136 | margin-left: 13px;
137 | color: ${({ theme }) => theme.COLORS.GRAY1};
138 | font-family: ${({ theme }) => theme.FONTS.POPPINSBOLD};
139 | `;
140 |
141 | export const ButtonVerTotos = styled.TouchableOpacity`
142 | padding: 3px;
143 | border-width: 1px;
144 | border-radius: 30px;
145 | border-color: ${({ theme }) => theme.COLORS.PURPLE_CARD};
146 | `;
147 |
148 | export const ButtonTitleVertotos = styled.Text`
149 | font-size: 12px;
150 | color: ${({ theme }) => theme.COLORS.PURPLEDARK1};
151 | font-family: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
152 | `;
153 |
154 | export const IconTransaction = styled.Image`
155 | width: 60px;
156 | height: 60px;
157 | `;
158 |
159 | export const DetailsTransaction = styled.View`
160 | flex: 1;
161 | `;
162 |
163 | export const NameTransaction = styled.Text`
164 | font-weight: 900;
165 | font-size: 16px;
166 | color: ${({ theme }) => theme.COLORS.GRAY1};
167 | font-weight: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
168 | `;
169 |
170 | export const SubtTitleTransaction = styled.Text`
171 | font-size: 14px;
172 | color: ${({ theme }) => theme.COLORS.GRAY4};
173 | font-weight: ${({ theme }) => theme.FONTS.POPPINSLIGHT};
174 | `;
175 |
176 | export const AmountTransaction = styled.Text`
177 | font-weight: 900;
178 | font-size: 16px;
179 | color: ${({ theme }) => theme.COLORS.GRAY1};
180 | font-weight: ${({ theme }) => theme.FONTS.POPPINSREGULAR};
181 | `;
182 |
--------------------------------------------------------------------------------
/android/app/src/main/java/com/walletapp/newarchitecture/MainApplicationReactNativeHost.java:
--------------------------------------------------------------------------------
1 | package com.walletapp.newarchitecture;
2 |
3 | import android.app.Application;
4 | import androidx.annotation.NonNull;
5 | import com.facebook.react.PackageList;
6 | import com.facebook.react.ReactInstanceManager;
7 | import com.facebook.react.ReactNativeHost;
8 | import com.facebook.react.ReactPackage;
9 | import com.facebook.react.ReactPackageTurboModuleManagerDelegate;
10 | import com.facebook.react.bridge.JSIModulePackage;
11 | import com.facebook.react.bridge.JSIModuleProvider;
12 | import com.facebook.react.bridge.JSIModuleSpec;
13 | import com.facebook.react.bridge.JSIModuleType;
14 | import com.facebook.react.bridge.JavaScriptContextHolder;
15 | import com.facebook.react.bridge.ReactApplicationContext;
16 | import com.facebook.react.bridge.UIManager;
17 | import com.facebook.react.fabric.ComponentFactory;
18 | import com.facebook.react.fabric.CoreComponentsRegistry;
19 | import com.facebook.react.fabric.EmptyReactNativeConfig;
20 | import com.facebook.react.fabric.FabricJSIModuleProvider;
21 | import com.facebook.react.fabric.ReactNativeConfig;
22 | import com.facebook.react.uimanager.ViewManagerRegistry;
23 | import com.walletapp.BuildConfig;
24 | import com.walletapp.newarchitecture.components.MainComponentsRegistry;
25 | import com.walletapp.newarchitecture.modules.MainApplicationTurboModuleManagerDelegate;
26 | import java.util.ArrayList;
27 | import java.util.List;
28 |
29 | /**
30 | * A {@link ReactNativeHost} that helps you load everything needed for the New Architecture, both
31 | * TurboModule delegates and the Fabric Renderer.
32 | *
33 | * Please note that this class is used ONLY if you opt-in for the New Architecture (see the
34 | * `newArchEnabled` property). Is ignored otherwise.
35 | */
36 | public class MainApplicationReactNativeHost extends ReactNativeHost {
37 | public MainApplicationReactNativeHost(Application application) {
38 | super(application);
39 | }
40 |
41 | @Override
42 | public boolean getUseDeveloperSupport() {
43 | return BuildConfig.DEBUG;
44 | }
45 |
46 | @Override
47 | protected List getPackages() {
48 | List packages = new PackageList(this).getPackages();
49 | // Packages that cannot be autolinked yet can be added manually here, for example:
50 | // packages.add(new MyReactNativePackage());
51 | // TurboModules must also be loaded here providing a valid TurboReactPackage implementation:
52 | // packages.add(new TurboReactPackage() { ... });
53 | // If you have custom Fabric Components, their ViewManagers should also be loaded here
54 | // inside a ReactPackage.
55 | return packages;
56 | }
57 |
58 | @Override
59 | protected String getJSMainModuleName() {
60 | return "index";
61 | }
62 |
63 | @NonNull
64 | @Override
65 | protected ReactPackageTurboModuleManagerDelegate.Builder
66 | getReactPackageTurboModuleManagerDelegateBuilder() {
67 | // Here we provide the ReactPackageTurboModuleManagerDelegate Builder. This is necessary
68 | // for the new architecture and to use TurboModules correctly.
69 | return new MainApplicationTurboModuleManagerDelegate.Builder();
70 | }
71 |
72 | @Override
73 | protected JSIModulePackage getJSIModulePackage() {
74 | return new JSIModulePackage() {
75 | @Override
76 | public List getJSIModules(
77 | final ReactApplicationContext reactApplicationContext,
78 | final JavaScriptContextHolder jsContext) {
79 | final List specs = new ArrayList<>();
80 |
81 | // Here we provide a new JSIModuleSpec that will be responsible of providing the
82 | // custom Fabric Components.
83 | specs.add(
84 | new JSIModuleSpec() {
85 | @Override
86 | public JSIModuleType getJSIModuleType() {
87 | return JSIModuleType.UIManager;
88 | }
89 |
90 | @Override
91 | public JSIModuleProvider getJSIModuleProvider() {
92 | final ComponentFactory componentFactory = new ComponentFactory();
93 | CoreComponentsRegistry.register(componentFactory);
94 |
95 | // Here we register a Components Registry.
96 | // The one that is generated with the template contains no components
97 | // and just provides you the one from React Native core.
98 | MainComponentsRegistry.register(componentFactory);
99 |
100 | final ReactInstanceManager reactInstanceManager = getReactInstanceManager();
101 |
102 | ViewManagerRegistry viewManagerRegistry =
103 | new ViewManagerRegistry(
104 | reactInstanceManager.getOrCreateViewManagers(reactApplicationContext));
105 |
106 | return new FabricJSIModuleProvider(
107 | reactApplicationContext,
108 | componentFactory,
109 | ReactNativeConfig.DEFAULT_CONFIG,
110 | viewManagerRegistry);
111 | }
112 | });
113 | return specs;
114 | }
115 | };
116 | }
117 | }
118 |
--------------------------------------------------------------------------------
/src/utils/transaction.ts:
--------------------------------------------------------------------------------
1 | import NetflixPng from "../assets/netflix.png";
2 | import PaypalPng from "../assets/paypal.png";
3 | import EntradaPng from "../assets/entrada.png";
4 |
5 | export const transaction = [
6 | {
7 | id: "1",
8 | title: "Pagto Netflix",
9 | subtitle: "Pagto referente a netflix",
10 | amount: 49.99,
11 | icon: NetflixPng
12 | },
13 | {
14 | id: "2",
15 | title: "Pagto Boleto Paypal",
16 | subtitle: "Pagto referente a boeleto paypal",
17 | amount: 99.50,
18 | icon: PaypalPng
19 | },
20 | {
21 | id: "3",
22 | title: "Entrada",
23 | subtitle: "Valor referente a entrada",
24 | amount: 500.00,
25 | icon: EntradaPng
26 | },
27 | {
28 | id: "4",
29 | title: "Pagto Netflix",
30 | subtitle: "Pagto referente a netflix",
31 | amount: 19.99,
32 | icon: NetflixPng
33 | },
34 | {
35 | id: "5",
36 | title: "Pagto Boleto Paypal",
37 | subtitle: "Pagto referente a boeleto paypal",
38 | amount: 39.50,
39 | icon: PaypalPng
40 | },
41 | {
42 | id: "6",
43 | title: "Entrada",
44 | subtitle: "Valor referente a entrada",
45 | amount: 300.00,
46 | icon: EntradaPng
47 | },
48 | {
49 | id: "7",
50 | title: "Pagto Netflix",
51 | subtitle: "Pagto referente a netflix",
52 | amount: 49.99,
53 | icon: NetflixPng
54 | },
55 | {
56 | id: "8",
57 | title: "Pagto Boleto Paypal",
58 | subtitle: "Pagto referente a boeleto paypal",
59 | amount: 99.50,
60 | icon: PaypalPng
61 | },
62 | {
63 | id: "9",
64 | title: "Entrada",
65 | subtitle: "Valor referente a entrada",
66 | amount: 500.00,
67 | icon: EntradaPng
68 | },
69 | {
70 | id: "10",
71 | title: "Pagto Netflix",
72 | subtitle: "Pagto referente a netflix",
73 | amount: 19.99,
74 | icon: NetflixPng
75 | },
76 | {
77 | id: "11",
78 | title: "Pagto Boleto Paypal",
79 | subtitle: "Pagto referente a boeleto paypal",
80 | amount: 39.50,
81 | icon: PaypalPng
82 | },
83 | {
84 | id: "12",
85 | title: "Entrada",
86 | subtitle: "Valor referente a entrada",
87 | amount: 300.00,
88 | icon: EntradaPng
89 | },
90 | {
91 | id: "13",
92 | title: "Pagto Netflix",
93 | subtitle: "Pagto referente a netflix",
94 | amount: 49.99,
95 | icon: NetflixPng
96 | },
97 | {
98 | id: "14",
99 | title: "Pagto Boleto Paypal",
100 | subtitle: "Pagto referente a boeleto paypal",
101 | amount: 99.50,
102 | icon: PaypalPng
103 | },
104 | {
105 | id: "15",
106 | title: "Entrada",
107 | subtitle: "Valor referente a entrada",
108 | amount: 500.00,
109 | icon: EntradaPng
110 | },
111 | {
112 | id: "16",
113 | title: "Pagto Netflix",
114 | subtitle: "Pagto referente a netflix",
115 | amount: 19.99,
116 | icon: NetflixPng
117 | },
118 | {
119 | id: "17",
120 | title: "Pagto Boleto Paypal",
121 | subtitle: "Pagto referente a boeleto paypal",
122 | amount: 39.50,
123 | icon: PaypalPng
124 | },
125 | {
126 | id: "18",
127 | title: "Entrada",
128 | subtitle: "Valor referente a entrada",
129 | amount: 300.00,
130 | icon: EntradaPng
131 | },
132 | {
133 | id: "19",
134 | title: "Pagto Netflix",
135 | subtitle: "Pagto referente a netflix",
136 | amount: 49.99,
137 | icon: NetflixPng
138 | },
139 | {
140 | id: "20",
141 | title: "Pagto Boleto Paypal",
142 | subtitle: "Pagto referente a boeleto paypal",
143 | amount: 99.50,
144 | icon: PaypalPng
145 | },
146 | {
147 | id: "21",
148 | title: "Entrada",
149 | subtitle: "Valor referente a entrada",
150 | amount: 500.00,
151 | icon: EntradaPng
152 | },
153 | {
154 | id: "22",
155 | title: "Pagto Netflix",
156 | subtitle: "Pagto referente a netflix",
157 | amount: 19.99,
158 | icon: NetflixPng
159 | },
160 | {
161 | id: "23",
162 | title: "Pagto Boleto Paypal",
163 | subtitle: "Pagto referente a boeleto paypal",
164 | amount: 39.50,
165 | icon: PaypalPng
166 | },
167 | {
168 | id: "24",
169 | title: "Entrada",
170 | subtitle: "Valor referente a entrada",
171 | amount: 300.00,
172 | icon: EntradaPng
173 | },
174 | {
175 | id: "25",
176 | title: "Saída",
177 | subtitle: "Valor referente a Saída",
178 | amount: 300.00,
179 | icon: EntradaPng
180 | },
181 | {
182 | id: "26",
183 | title: "Entrada",
184 | subtitle: "Valor referente a entrada",
185 | amount: 300.00,
186 | icon: EntradaPng
187 | },
188 | {
189 | id: "27",
190 | title: "Saída",
191 | subtitle: "Valor referente a Saída",
192 | amount: 300.00,
193 | icon: EntradaPng
194 | }
195 | ]
--------------------------------------------------------------------------------
/src/routes/tab.routes.tsx:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { View, Platform } from 'react-native';
3 | import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
4 | import { CreditCard, ChartBar, Bell, GearSix } from 'phosphor-react-native';
5 |
6 | import theme from '../styles/theme';
7 | import { Settings } from '../screens/Tab/Settings';
8 | import { Carteira } from '../screens/Tab/Carteira';
9 | import { Relatorio } from '../screens/Tab/Relatorio';
10 | import { Notificacao } from '../screens/Tab/Notificacao';
11 |
12 | const { Navigator, Screen } = createBottomTabNavigator();
13 |
14 | export const TabRoutes = () => {
15 | return (
16 |
33 | (
39 |
46 | {focused ? (
47 |
52 | ) : (
53 |
58 | )}
59 |
60 | )
61 | }}
62 | />
63 | (
69 |
76 | {focused ? (
77 |
82 | ) : (
83 |
88 | )}
89 |
90 | )
91 | }}
92 | />
93 | (
99 |
106 | {focused ? (
107 |
112 | ) : (
113 |
118 | )}
119 |
120 | )
121 | }}
122 | />
123 | (
129 |
136 | {focused ? (
137 |
142 | ) : (
143 |
148 | )}
149 |
150 | )
151 | }}
152 | />
153 |
154 | )
155 | }
--------------------------------------------------------------------------------
/ios/walletapp/AppDelegate.mm:
--------------------------------------------------------------------------------
1 | #import "AppDelegate.h"
2 |
3 | #import
4 | #import
5 | #import
6 | #import
7 | #import
8 |
9 | #import
10 |
11 | #if RCT_NEW_ARCH_ENABLED
12 | #import
13 | #import
14 | #import
15 | #import
16 | #import
17 | #import
18 |
19 | #import
20 |
21 | static NSString *const kRNConcurrentRoot = @"concurrentRoot";
22 |
23 | @interface AppDelegate () {
24 | RCTTurboModuleManager *_turboModuleManager;
25 | RCTSurfacePresenterBridgeAdapter *_bridgeAdapter;
26 | std::shared_ptr _reactNativeConfig;
27 | facebook::react::ContextContainer::Shared _contextContainer;
28 | }
29 | @end
30 | #endif
31 |
32 | @implementation AppDelegate
33 |
34 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
35 | {
36 | RCTAppSetupPrepareApp(application);
37 |
38 | RCTBridge *bridge = [self.reactDelegate createBridgeWithDelegate:self launchOptions:launchOptions];
39 |
40 | #if RCT_NEW_ARCH_ENABLED
41 | _contextContainer = std::make_shared();
42 | _reactNativeConfig = std::make_shared();
43 | _contextContainer->insert("ReactNativeConfig", _reactNativeConfig);
44 | _bridgeAdapter = [[RCTSurfacePresenterBridgeAdapter alloc] initWithBridge:bridge contextContainer:_contextContainer];
45 | bridge.surfacePresenter = _bridgeAdapter.surfacePresenter;
46 | #endif
47 |
48 | NSDictionary *initProps = [self prepareInitialProps];
49 | UIView *rootView = [self.reactDelegate createRootViewWithBridge:bridge moduleName:@"main" initialProperties:initProps];
50 |
51 | rootView.backgroundColor = [UIColor whiteColor];
52 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
53 | UIViewController *rootViewController = [self.reactDelegate createRootViewController];
54 | rootViewController.view = rootView;
55 | self.window.rootViewController = rootViewController;
56 | [self.window makeKeyAndVisible];
57 |
58 | [super application:application didFinishLaunchingWithOptions:launchOptions];
59 |
60 | return YES;
61 | }
62 |
63 | - (NSArray> *)extraModulesForBridge:(RCTBridge *)bridge
64 | {
65 | // If you'd like to export some custom RCTBridgeModules, add them here!
66 | return @[];
67 | }
68 |
69 | /// This method controls whether the `concurrentRoot`feature of React18 is turned on or off.
70 | ///
71 | /// @see: https://reactjs.org/blog/2022/03/29/react-v18.html
72 | /// @note: This requires to be rendering on Fabric (i.e. on the New Architecture).
73 | /// @return: `true` if the `concurrentRoot` feture is enabled. Otherwise, it returns `false`.
74 | - (BOOL)concurrentRootEnabled
75 | {
76 | // Switch this bool to turn on and off the concurrent root
77 | return true;
78 | }
79 |
80 | - (NSDictionary *)prepareInitialProps
81 | {
82 | NSMutableDictionary *initProps = [NSMutableDictionary new];
83 | #if RCT_NEW_ARCH_ENABLED
84 | initProps[kRNConcurrentRoot] = @([self concurrentRootEnabled]);
85 | #endif
86 | return initProps;
87 | }
88 |
89 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge
90 | {
91 | #if DEBUG
92 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index"];
93 | #else
94 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"];
95 | #endif
96 | }
97 |
98 | // Linking API
99 | - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary *)options {
100 | return [super application:application openURL:url options:options] || [RCTLinkingManager application:application openURL:url options:options];
101 | }
102 |
103 | // Universal Links
104 | - (BOOL)application:(UIApplication *)application continueUserActivity:(nonnull NSUserActivity *)userActivity restorationHandler:(nonnull void (^)(NSArray> * _Nullable))restorationHandler {
105 | BOOL result = [RCTLinkingManager application:application continueUserActivity:userActivity restorationHandler:restorationHandler];
106 | return [super application:application continueUserActivity:userActivity restorationHandler:restorationHandler] || result;
107 | }
108 |
109 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
110 | - (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
111 | {
112 | return [super application:application didRegisterForRemoteNotificationsWithDeviceToken:deviceToken];
113 | }
114 |
115 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
116 | - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error
117 | {
118 | return [super application:application didFailToRegisterForRemoteNotificationsWithError:error];
119 | }
120 |
121 | // Explicitly define remote notification delegates to ensure compatibility with some third-party libraries
122 | - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
123 | {
124 | return [super application:application didReceiveRemoteNotification:userInfo fetchCompletionHandler:completionHandler];
125 | }
126 |
127 | #if RCT_NEW_ARCH_ENABLED
128 |
129 | #pragma mark - RCTCxxBridgeDelegate
130 |
131 | - (std::unique_ptr)jsExecutorFactoryForBridge:(RCTBridge *)bridge
132 | {
133 | _turboModuleManager = [[RCTTurboModuleManager alloc] initWithBridge:bridge
134 | delegate:self
135 | jsInvoker:bridge.jsCallInvoker];
136 | return RCTAppSetupDefaultJsExecutorFactory(bridge, _turboModuleManager);
137 | }
138 |
139 | #pragma mark RCTTurboModuleManagerDelegate
140 |
141 | - (Class)getModuleClassFromName:(const char *)name
142 | {
143 | return RCTCoreModulesClassProvider(name);
144 | }
145 |
146 | - (std::shared_ptr)getTurboModule:(const std::string &)name
147 | jsInvoker:(std::shared_ptr)jsInvoker
148 | {
149 | return nullptr;
150 | }
151 |
152 | - (std::shared_ptr)getTurboModule:(const std::string &)name
153 | initParams:
154 | (const facebook::react::ObjCTurboModule::InitParams &)params
155 | {
156 | return nullptr;
157 | }
158 |
159 | - (id)getModuleInstanceFromClass:(Class)moduleClass
160 | {
161 | return RCTAppSetupDefaultModuleFromClass(moduleClass);
162 | }
163 |
164 | #endif
165 |
166 | @end
167 |
--------------------------------------------------------------------------------