(
41 | "auth/logout",
42 | async (_, { rejectWithValue }) => {
43 | try {
44 | return await auth().signOut();
45 | } catch (e) {
46 | return rejectWithValue(e.code);
47 | }
48 | },
49 | );
50 |
51 | export interface AuthState {
52 | user: User | null;
53 | loading: boolean;
54 | }
55 |
56 | const initialState = defaultInitialState.auth as AuthState;
57 |
58 | export const authSlice = createSlice({
59 | name: "auth",
60 | initialState,
61 | reducers: {},
62 | extraReducers: builder => {
63 | builder
64 | .addCase(login.fulfilled, (state, action) => {
65 | state.user = action.payload;
66 | state.loading = false;
67 | })
68 | .addCase(logout.fulfilled, state => {
69 | state.user = null;
70 | state.loading = false;
71 | })
72 | .addMatcher(
73 | action => action.type.endsWith("/pending"),
74 | state => {
75 | state.loading = true;
76 | },
77 | )
78 | .addMatcher(
79 | action => action.type.endsWith("/rejected"),
80 | state => {
81 | state.loading = false;
82 | },
83 | );
84 | },
85 | });
86 |
87 | export const selectAuth = (state: RootState) => state.auth;
88 |
89 | export const selectCurrentUser = (state: RootState) => state.auth.user;
90 |
91 | export const authReducer = authSlice.reducer;
92 |
--------------------------------------------------------------------------------
/android/app/src/debug/java/com/appart/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.appart;
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 |
32 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults()));
33 | client.addPlugin(new ReactFlipperPlugin());
34 | client.addPlugin(new DatabasesFlipperPlugin(context));
35 | client.addPlugin(new SharedPreferencesFlipperPlugin(context));
36 | client.addPlugin(CrashReporterPlugin.getInstance());
37 |
38 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin();
39 | NetworkingModule.setCustomClientBuilder(
40 | new NetworkingModule.CustomClientBuilder() {
41 | @Override
42 | public void apply(OkHttpClient.Builder builder) {
43 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin));
44 | }
45 | });
46 | client.addPlugin(networkFlipperPlugin);
47 | client.start();
48 |
49 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized
50 | // Hence we run if after all native modules have been initialized
51 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext();
52 | if (reactContext == null) {
53 | reactInstanceManager.addReactInstanceEventListener(
54 | new ReactInstanceManager.ReactInstanceEventListener() {
55 | @Override
56 | public void onReactContextInitialized(ReactContext reactContext) {
57 | reactInstanceManager.removeReactInstanceEventListener(this);
58 | reactContext.runOnNativeModulesQueueThread(
59 | new Runnable() {
60 | @Override
61 | public void run() {
62 | client.addPlugin(new FrescoFlipperPlugin());
63 | }
64 | });
65 | }
66 | });
67 | } else {
68 | client.addPlugin(new FrescoFlipperPlugin());
69 | }
70 | }
71 | }
72 | }
73 |
--------------------------------------------------------------------------------
/ios/appArt.xcodeproj/xcshareddata/xcschemes/appArt.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/favorites-screen/FavoritesScreen.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import {
3 | View,
4 | FlatList,
5 | ListRenderItem,
6 | TouchableOpacity,
7 | StyleSheet,
8 | LayoutAnimation,
9 | } from "react-native";
10 | import FastImage from "react-native-fast-image";
11 | import { Container, Text } from "@components/index";
12 | import { useAppSelector, useAppDispatch } from "@hooks/redux";
13 | import { favoritesSelector, removeItem } from "@state/slices/favoritesSlice";
14 | import { SafeAreaView } from "react-native-safe-area-context";
15 | import { FavoriteItem } from "@model/index";
16 | import { getImageURI } from "@api/utils";
17 | import Icon from "react-native-vector-icons/Feather";
18 | import { COLORS, S_WIDTH, BASE_URL } from "@constants/index";
19 | import ROUTES from "@navigation/routes";
20 |
21 | export const FavoritesScreen = ({ navigation }) => {
22 | const favoritesData = useAppSelector(favoritesSelector.selectAll);
23 | const dispatch = useAppDispatch();
24 |
25 | const onArtworkPress = (id: number) => {
26 | navigation.navigate(ROUTES.BROWSER, {
27 | url: BASE_URL + id,
28 | });
29 | };
30 |
31 | const onRemovePress = (id: number) => {
32 | LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
33 | dispatch(removeItem({ id }));
34 | };
35 |
36 | const renderItem: ListRenderItem = ({ item }) => {
37 | return (
38 |
39 | onArtworkPress(item.id)}
42 | style={styles.touchWrapper}>
43 |
48 |
49 | {item.title}
50 | {item.artist_title}
51 |
52 |
53 | onRemovePress(item.id)}
55 | style={styles.deleteButton}>
56 |
57 |
58 |
59 | );
60 | };
61 |
62 | return (
63 |
64 |
65 |
66 |
67 |
68 | );
69 | };
70 |
71 | const styles = StyleSheet.create({
72 | favItem: {
73 | width: S_WIDTH,
74 | marginVertical: 10,
75 | paddingHorizontal: 16,
76 | flexDirection: "row",
77 | justifyContent: "space-between",
78 | },
79 | touchWrapper: {
80 | flexDirection: "row",
81 | },
82 | labelContainer: {
83 | width: S_WIDTH - 200,
84 | paddingHorizontal: 16,
85 | marginTop: 4,
86 | },
87 | image: {
88 | height: 100,
89 | width: 100,
90 | borderRadius: 6,
91 | },
92 | deleteButton: {
93 | width: 44,
94 | height: 44,
95 | alignItems: "center",
96 | justifyContent: "center",
97 | borderRadius: 20,
98 | backgroundColor: COLORS.ICON_BG,
99 | },
100 | });
101 |
--------------------------------------------------------------------------------
/src/state/slices/favoritesSlice.ts:
--------------------------------------------------------------------------------
1 | import {
2 | createSlice,
3 | createEntityAdapter,
4 | createAsyncThunk,
5 | } from "@reduxjs/toolkit";
6 | import { RootState } from "@state/store/configureStore";
7 | import { TThunkAPI } from "../types";
8 | import { FavoriteItem } from "@model/index";
9 | import defaultInitialState from "@state/store/initialState";
10 | import auth from "@react-native-firebase/auth";
11 | import firestore from "@react-native-firebase/firestore";
12 |
13 | export const addItem = createAsyncThunk(
14 | "favorites/add",
15 | async (item, { dispatch, extra: { dbRef } }) => {
16 | const uid = auth().currentUser?.uid;
17 | if (uid) {
18 | dbRef.doc(uid).update({
19 | [item.id]: item,
20 | });
21 | }
22 | dispatch(addOne(item));
23 | },
24 | );
25 |
26 | export const removeItem = createAsyncThunk(
27 | "favorites/remove",
28 | async ({ id }, { dispatch, extra: { dbRef } }) => {
29 | const uid = auth().currentUser?.uid;
30 | if (uid) {
31 | dbRef.doc(uid).update({
32 | [id]: firestore.FieldValue.delete(),
33 | });
34 | }
35 | dispatch(removeOne(id));
36 | },
37 | );
38 |
39 | export const mergeItems = createAsyncThunk(
40 | "favorites/merge",
41 | async (_, { dispatch, getState, extra: { dbRef } }) => {
42 | const rootState = getState() as RootState;
43 | const uid = auth().currentUser?.uid;
44 | if (uid) {
45 | const { entities: entitiesApp, ids: idsApp } = rootState.favorites;
46 | dbRef
47 | .doc(uid)
48 | .get()
49 | .then(async documentSnapshot => {
50 | if (documentSnapshot.exists) {
51 | const entitiesFirebase = documentSnapshot.data();
52 | const idsFirebase = Object.keys(entitiesFirebase);
53 |
54 | let result: FavoriteItem[] = Object.values(entitiesApp);
55 |
56 | idsFirebase.forEach(id => {
57 | !idsApp.includes(Number(id)) &&
58 | result.push(entitiesFirebase[id]);
59 | });
60 |
61 | result.sort((a, b) => a.timestamp - b.timestamp);
62 |
63 | idsApp.length > 0 &&
64 | dbRef.doc(uid).update({ ...entitiesApp });
65 | dispatch(setAll(result));
66 | console.log("Firebase document updated");
67 | } else {
68 | dbRef.doc(uid).set(entitiesApp);
69 | console.log("Firebase document created");
70 | }
71 | });
72 | }
73 | },
74 | );
75 |
76 | export interface FavoritesState {
77 | ids: number[];
78 | entities: {};
79 | }
80 |
81 | const initialState = defaultInitialState.favorites as FavoritesState;
82 |
83 | const favoritesAdapter = createEntityAdapter({
84 | selectId: item => item.id,
85 | });
86 |
87 | export const favoritesSlice = createSlice({
88 | name: "favorites",
89 | initialState,
90 | reducers: {
91 | addOne: favoritesAdapter.addOne,
92 | removeOne: favoritesAdapter.removeOne,
93 | setAll: favoritesAdapter.setAll,
94 | },
95 | });
96 |
97 | const { addOne, removeOne, setAll } = favoritesSlice.actions;
98 |
99 | export const favoritesSelector = favoritesAdapter.getSelectors(
100 | state => state.favorites,
101 | );
102 |
103 | export const favoritesReducer = favoritesSlice.reducer;
104 |
--------------------------------------------------------------------------------
/src/api/api.types.ts:
--------------------------------------------------------------------------------
1 | type SearchItem = {
2 | _score: number;
3 | thumbnail: {
4 | alt_text: string;
5 | width: number;
6 | lqip: string;
7 | height: number;
8 | };
9 | api_model: string;
10 | is_boosted: boolean;
11 | api_link: string;
12 | id: number;
13 | title: string;
14 | timestamp: string;
15 | };
16 |
17 | export type SearchResponse = {
18 | pagination: {
19 | total: number;
20 | limit: number;
21 | offset: number;
22 | total_pages: number;
23 | current_page: number;
24 | };
25 | data: SearchItem[];
26 | };
27 |
28 | type ArtworkDataItem = {
29 | id: number;
30 | api_model: string;
31 | api_link: string;
32 | is_boosted: boolean;
33 | title: string;
34 | alt_titles: any;
35 | thumbnail: {
36 | lqip: string;
37 | width: number;
38 | height: number;
39 | alt_text: string;
40 | };
41 | main_reference_number: string;
42 | has_not_been_viewed_much: boolean;
43 | boost_rank: any;
44 | date_start: number;
45 | date_end: number;
46 | date_display: string;
47 | date_qualifier_title: string;
48 | date_qualifier_id: any;
49 | artist_display: string;
50 | place_of_origin: string;
51 | dimensions: string;
52 | medium_display: string;
53 | inscriptions: string;
54 | credit_line: string;
55 | publication_history: string;
56 | exhibition_history: string;
57 | provenance_text: string;
58 | publishing_verification_level: string;
59 | internal_department_id: number;
60 | fiscal_year: number;
61 | fiscal_year_deaccession: any;
62 | is_public_domain: boolean;
63 | is_zoomable: boolean;
64 | max_zoom_window_size: number;
65 | copyright_notice: any;
66 | has_multimedia_resources: boolean;
67 | has_educational_resources: boolean;
68 | colorfulness: number;
69 | color: {
70 | h: number;
71 | l: number;
72 | s: number;
73 | percentage: number;
74 | population: number;
75 | };
76 | latitude?: number;
77 | longitude?: number;
78 | latlon?: string;
79 | is_on_view: boolean;
80 | on_loan_display: string;
81 | gallery_title: any;
82 | gallery_id: any;
83 | artwork_type_title: string;
84 | artwork_type_id: number;
85 | department_title: string;
86 | department_id: string;
87 | artist_id: number;
88 | artist_title: string;
89 | alt_artist_ids: Array;
90 | artist_ids: Array;
91 | artist_titles: Array;
92 | category_ids: Array;
93 | category_titles: Array;
94 | artwork_catalogue_ids: Array;
95 | term_titles: Array;
96 | style_id: string;
97 | style_title: string;
98 | alt_style_ids: Array;
99 | style_ids: Array;
100 | style_titles: Array;
101 | classification_id: string;
102 | classification_title: string;
103 | alt_classification_ids: Array;
104 | classification_ids: Array;
105 | classification_titles: Array;
106 | subject_id: string;
107 | alt_subject_ids: Array;
108 | subject_ids: Array;
109 | subject_titles: Array;
110 | material_id: string;
111 | alt_material_ids: Array;
112 | material_ids: Array;
113 | material_titles: Array;
114 | technique_id?: string;
115 | alt_technique_ids: Array;
116 | technique_ids: Array;
117 | technique_titles: Array;
118 | theme_titles: Array;
119 | image_id: string;
120 | alt_image_ids: Array;
121 | document_ids: Array;
122 | sound_ids: Array;
123 | video_ids: Array;
124 | text_ids: Array;
125 | section_ids: Array;
126 | section_titles: Array;
127 | site_ids: Array;
128 | suggest_autocomplete_all: Array<{
129 | input: Array;
130 | contexts: {
131 | groupings: Array;
132 | };
133 | weight?: number;
134 | }>;
135 | last_updated_source: string;
136 | last_updated: string;
137 | timestamp: string;
138 | suggest_autocomplete_boosted?: string;
139 | };
140 |
141 | export type GetArtworksResponse = {
142 | pagination: {
143 | total: number;
144 | limit: number;
145 | offset: number;
146 | total_pages: number;
147 | current_page: number;
148 | next_url: string;
149 | };
150 | data: ArtworkDataItem[];
151 | };
152 |
--------------------------------------------------------------------------------
/src/screens/details-screen/DetailsScreen.tsx:
--------------------------------------------------------------------------------
1 | import React, { useEffect, useRef } from "react";
2 | import {
3 | Animated,
4 | FlatList,
5 | StyleSheet,
6 | View,
7 | ListRenderItem,
8 | NativeSyntheticEvent,
9 | NativeScrollEvent,
10 | } from "react-native";
11 | import FastImage from "react-native-fast-image";
12 | import { useAppSelector, useAppDispatch } from "@hooks/redux";
13 | import {
14 | addItem,
15 | removeItem,
16 | favoritesSelector,
17 | } from "@state/slices/favoritesSlice";
18 | import { selectArtworksData } from "@state/slices/artworksSlice";
19 | import {
20 | Container,
21 | Text,
22 | RoundButton,
23 | FavoriteButton,
24 | } from "@components/index";
25 | import { COLORS, S_WIDTH, S_HEIGT, BASE_URL } from "@constants/index";
26 | import { SharedElement } from "react-navigation-shared-element";
27 | import { GridItem } from "@model/index";
28 | import { getImageURI } from "@api/utils";
29 | import ROUTES from "@navigation/routes";
30 | import { getFavoriteItem } from "@utils/helpers";
31 |
32 | export const DetailsScreen = ({ navigation, route }) => {
33 | const artworks = useAppSelector(selectArtworksData);
34 | const favoritesIds = useAppSelector(favoritesSelector.selectIds);
35 | const dispatch = useAppDispatch();
36 |
37 | const { initialScrollIndex } = route.params;
38 | const currentScrollIndex = useRef(initialScrollIndex);
39 | const opacity = useRef(new Animated.Value(0)).current;
40 |
41 | useEffect(() => {
42 | setTimeout(() => {
43 | Animated.timing(opacity, {
44 | toValue: 1,
45 | duration: 250,
46 | useNativeDriver: true,
47 | }).start();
48 | }, 500);
49 | }, []);
50 |
51 | const onBackButtonPress = () => {
52 | navigation.navigate(ROUTES.HOME, {
53 | currentScrollIndex: currentScrollIndex.current,
54 | });
55 | };
56 |
57 | const onInfoButtonPress = () => {
58 | navigation.navigate(ROUTES.BROWSER, {
59 | url: BASE_URL + artworks[currentScrollIndex.current].id,
60 | });
61 | };
62 |
63 | const onFavoritePress = (item: GridItem, active: boolean) => {
64 | dispatch(active ? removeItem(item) : addItem(getFavoriteItem(item)));
65 | };
66 |
67 | const renderItem: ListRenderItem = ({ item, index }) => {
68 | const active = favoritesIds.includes(item.id);
69 | return (
70 |
71 |
72 |
77 |
78 |
79 |
80 |
81 | {item.title}
82 | {item.artist_title}
83 |
84 | onFavoritePress(item, active)}
86 | active={active}
87 | />
88 |
89 |
90 | );
91 | };
92 |
93 | const getItemLayout = (_, index: number) => ({
94 | length: S_WIDTH,
95 | offset: S_WIDTH * index,
96 | index,
97 | });
98 |
99 | const onMomentumScrollEnd = (e: NativeSyntheticEvent) =>
100 | (currentScrollIndex.current = Math.round(
101 | e.nativeEvent.contentOffset.x / S_WIDTH,
102 | ));
103 |
104 | return (
105 |
106 |
116 |
117 |
118 |
119 |
120 |
121 | );
122 | };
123 |
124 | const styles = StyleSheet.create({
125 | container: { backgroundColor: COLORS.DEFAULT },
126 | image: {
127 | height: S_HEIGT,
128 | width: S_WIDTH,
129 | },
130 | backButtonWrapper: {
131 | position: "absolute",
132 | flexDirection: "row",
133 | justifyContent: "space-between",
134 | top: 48,
135 | left: 16,
136 | right: 16,
137 | },
138 | labelWrapper: {
139 | position: "absolute",
140 | backgroundColor: COLORS.BG,
141 | width: S_WIDTH - 48,
142 | borderRadius: 8,
143 | bottom: 44,
144 | marginHorizontal: 24,
145 | paddingHorizontal: 24,
146 | paddingVertical: 8,
147 | flexDirection: "row",
148 | justifyContent: "space-between",
149 | alignItems: "center",
150 | },
151 | labelText: {
152 | width: S_WIDTH / 1.5,
153 | },
154 | });
155 |
--------------------------------------------------------------------------------
/android/gradlew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env sh
2 |
3 | #
4 | # Copyright 2015 the original author or authors.
5 | #
6 | # Licensed under the Apache License, Version 2.0 (the "License");
7 | # you may not use this file except in compliance with the License.
8 | # You may obtain a copy of the License at
9 | #
10 | # https://www.apache.org/licenses/LICENSE-2.0
11 | #
12 | # Unless required by applicable law or agreed to in writing, software
13 | # distributed under the License is distributed on an "AS IS" BASIS,
14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 | # See the License for the specific language governing permissions and
16 | # limitations under the License.
17 | #
18 |
19 | ##############################################################################
20 | ##
21 | ## Gradle start up script for UN*X
22 | ##
23 | ##############################################################################
24 |
25 | # Attempt to set APP_HOME
26 | # Resolve links: $0 may be a link
27 | PRG="$0"
28 | # Need this for relative symlinks.
29 | while [ -h "$PRG" ] ; do
30 | ls=`ls -ld "$PRG"`
31 | link=`expr "$ls" : '.*-> \(.*\)$'`
32 | if expr "$link" : '/.*' > /dev/null; then
33 | PRG="$link"
34 | else
35 | PRG=`dirname "$PRG"`"/$link"
36 | fi
37 | done
38 | SAVED="`pwd`"
39 | cd "`dirname \"$PRG\"`/" >/dev/null
40 | APP_HOME="`pwd -P`"
41 | cd "$SAVED" >/dev/null
42 |
43 | APP_NAME="Gradle"
44 | APP_BASE_NAME=`basename "$0"`
45 |
46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
48 |
49 | # Use the maximum available, or set MAX_FD != -1 to use that value.
50 | MAX_FD="maximum"
51 |
52 | warn () {
53 | echo "$*"
54 | }
55 |
56 | die () {
57 | echo
58 | echo "$*"
59 | echo
60 | exit 1
61 | }
62 |
63 | # OS specific support (must be 'true' or 'false').
64 | cygwin=false
65 | msys=false
66 | darwin=false
67 | nonstop=false
68 | case "`uname`" in
69 | CYGWIN* )
70 | cygwin=true
71 | ;;
72 | Darwin* )
73 | darwin=true
74 | ;;
75 | MINGW* )
76 | msys=true
77 | ;;
78 | NONSTOP* )
79 | nonstop=true
80 | ;;
81 | esac
82 |
83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
84 |
85 |
86 | # Determine the Java command to use to start the JVM.
87 | if [ -n "$JAVA_HOME" ] ; then
88 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
89 | # IBM's JDK on AIX uses strange locations for the executables
90 | JAVACMD="$JAVA_HOME/jre/sh/java"
91 | else
92 | JAVACMD="$JAVA_HOME/bin/java"
93 | fi
94 | if [ ! -x "$JAVACMD" ] ; then
95 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
96 |
97 | Please set the JAVA_HOME variable in your environment to match the
98 | location of your Java installation."
99 | fi
100 | else
101 | JAVACMD="java"
102 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
103 |
104 | Please set the JAVA_HOME variable in your environment to match the
105 | location of your Java installation."
106 | fi
107 |
108 | # Increase the maximum file descriptors if we can.
109 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
110 | MAX_FD_LIMIT=`ulimit -H -n`
111 | if [ $? -eq 0 ] ; then
112 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
113 | MAX_FD="$MAX_FD_LIMIT"
114 | fi
115 | ulimit -n $MAX_FD
116 | if [ $? -ne 0 ] ; then
117 | warn "Could not set maximum file descriptor limit: $MAX_FD"
118 | fi
119 | else
120 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
121 | fi
122 | fi
123 |
124 | # For Darwin, add options to specify how the application appears in the dock
125 | if $darwin; then
126 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
127 | fi
128 |
129 | # For Cygwin or MSYS, switch paths to Windows format before running java
130 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
131 | APP_HOME=`cygpath --path --mixed "$APP_HOME"`
132 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133 |
134 | JAVACMD=`cygpath --unix "$JAVACMD"`
135 |
136 | # We build the pattern for arguments to be converted via cygpath
137 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
138 | SEP=""
139 | for dir in $ROOTDIRSRAW ; do
140 | ROOTDIRS="$ROOTDIRS$SEP$dir"
141 | SEP="|"
142 | done
143 | OURCYGPATTERN="(^($ROOTDIRS))"
144 | # Add a user-defined pattern to the cygpath arguments
145 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then
146 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
147 | fi
148 | # Now convert the arguments - kludge to limit ourselves to /bin/sh
149 | i=0
150 | for arg in "$@" ; do
151 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
152 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
153 |
154 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
155 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
156 | else
157 | eval `echo args$i`="\"$arg\""
158 | fi
159 | i=`expr $i + 1`
160 | done
161 | case $i in
162 | 0) set -- ;;
163 | 1) set -- "$args0" ;;
164 | 2) set -- "$args0" "$args1" ;;
165 | 3) set -- "$args0" "$args1" "$args2" ;;
166 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
167 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
168 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
169 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
170 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
171 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
172 | esac
173 | fi
174 |
175 | # Escape application args
176 | save () {
177 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
178 | echo " "
179 | }
180 | APP_ARGS=`save "$@"`
181 |
182 | # Collect all arguments for the java command, following the shell quoting and substitution rules
183 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
184 |
185 | exec "$JAVACMD" "$@"
186 |
--------------------------------------------------------------------------------
/src/screens/account-screen/AccountScreen.tsx:
--------------------------------------------------------------------------------
1 | import React, { useRef, useState } from "react";
2 | import {
3 | View,
4 | Keyboard,
5 | KeyboardAvoidingView,
6 | TouchableWithoutFeedback,
7 | LayoutAnimation,
8 | Platform,
9 | StyleSheet,
10 | } from "react-native";
11 | import {
12 | Container,
13 | Text,
14 | TextField,
15 | Button,
16 | Criteria,
17 | } from "@components/index";
18 | import { useAppSelector, useAppDispatch } from "@hooks/redux";
19 | import { selectAuth, login, logout } from "@state/slices/authSlice";
20 | import { isRejected } from "@reduxjs/toolkit";
21 | import { AUTH_ALERTS } from "@constants/firebase";
22 | import { showAlert } from "@utils/helpers";
23 | import { useFormik } from "formik";
24 | import * as yup from "yup";
25 |
26 | export type FormValues = {
27 | email: string;
28 | password: string;
29 | };
30 |
31 | export const AccountScreen = () => {
32 | const inputRefs = useRef({});
33 | const dispatch = useAppDispatch();
34 |
35 | const [passwordInFocus, setPasswordInFocus] = useState(false);
36 | const { user, loading } = useAppSelector(selectAuth);
37 |
38 | const onSubmit = async (values: FormValues, { resetForm }) => {
39 | const result = await dispatch(login(values));
40 | if (isRejected(result)) {
41 | const alert = AUTH_ALERTS[result.payload];
42 | showAlert(alert ? alert : AUTH_ALERTS.DEFAULT);
43 | } else {
44 | resetForm();
45 | }
46 | };
47 |
48 | const onSignOut = () => {
49 | dispatch(logout());
50 | };
51 |
52 | const formik = useFormik({
53 | initialValues: {
54 | email: "",
55 | password: "",
56 | },
57 | onSubmit,
58 | validateOnMount: true,
59 | validationSchema: yup.object().shape({
60 | email: yup
61 | .string()
62 | .email("Email must be valid")
63 | .required("Email is required"),
64 | password: yup
65 | .string()
66 | .required("Password is required")
67 | .test(
68 | "is-valid-password",
69 | "Password is invalid",
70 | value => value?.length >= 6 && !!value?.match(/[A-Z]/),
71 | ),
72 | }),
73 | });
74 |
75 | const onPasswordFocusToggle = state => {
76 | LayoutAnimation.configureNext(LayoutAnimation.Presets.easeInEaseOut);
77 | setPasswordInFocus(state);
78 | };
79 |
80 | return (
81 |
82 | {!user ? (
83 | {
85 | Keyboard.dismiss();
86 | }}>
87 |
91 |
92 | WELCOME!
93 | Login/signup to save your
94 | favorite atrwork in the cloud.
95 |
96 |
97 |
104 | inputRefs.current["password"]?.focus()
105 | }
106 | autoCapitalize="none"
107 | keyboardType="email-address"
108 | returnKeyType="next"
109 | errorMessage={
110 | formik.touched.email &&
111 | (formik.errors?.email as string)
112 | }
113 | />
114 | {
116 | inputRefs.current["password"] = ref;
117 | }}
118 | label="Password"
119 | placeholder="Enter a secure password"
120 | placeholderTextColor="gray"
121 | value={formik.values.password}
122 | onChangeText={formik.handleChange("password")}
123 | onSubmitEditing={formik.handleSubmit}
124 | autoCapitalize="none"
125 | returnKeyType="done"
126 | secureTextEntry
127 | blurOnSubmit={false}
128 | onFocus={() => onPasswordFocusToggle(true)}
129 | onBlur={() => onPasswordFocusToggle(false)}
130 | errorMessage={
131 | formik.touched.password &&
132 | (formik.errors?.password as string)
133 | }
134 | />
135 | {passwordInFocus && (
136 | v.length >= 6,
141 | },
142 | {
143 | title: "1 upper case letter",
144 | check: v => v.match(/[A-Z]/),
145 | },
146 | ]}
147 | value={formik.values.password}
148 | />
149 | )}
150 |
151 |
156 |
157 |
158 |
159 | ) : (
160 |
161 |
162 | WELCOME,
163 | {user.email}
164 |
165 |
166 |
167 |
168 |
169 | )}
170 |
171 | );
172 | };
173 |
174 | const styles = StyleSheet.create({
175 | header: {
176 | alignItems: "center",
177 | marginBottom: 26,
178 | },
179 | container: {
180 | width: "100%",
181 | paddingHorizontal: 16,
182 | },
183 | });
184 |
--------------------------------------------------------------------------------
/android/app/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: "com.android.application"
2 |
3 | import com.android.build.OutputFile
4 |
5 | /**
6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets
7 | * and bundleReleaseJsAndAssets).
8 | * These basically call `react-native bundle` with the correct arguments during the Android build
9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the
10 | * bundle directly from the development server. Below you can see all the possible configurations
11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the
12 | * `apply from: "../../node_modules/react-native/react.gradle"` line.
13 | *
14 | * project.ext.react = [
15 | * // the name of the generated asset file containing your JS bundle
16 | * bundleAssetName: "index.android.bundle",
17 | *
18 | * // the entry file for bundle generation. If none specified and
19 | * // "index.android.js" exists, it will be used. Otherwise "index.js" is
20 | * // default. Can be overridden with ENTRY_FILE environment variable.
21 | * entryFile: "index.android.js",
22 | *
23 | * // https://reactnative.dev/docs/performance#enable-the-ram-format
24 | * bundleCommand: "ram-bundle",
25 | *
26 | * // whether to bundle JS and assets in debug mode
27 | * bundleInDebug: false,
28 | *
29 | * // whether to bundle JS and assets in release mode
30 | * bundleInRelease: true,
31 | *
32 | * // whether to bundle JS and assets in another build variant (if configured).
33 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants
34 | * // The configuration property can be in the following formats
35 | * // 'bundleIn${productFlavor}${buildType}'
36 | * // 'bundleIn${buildType}'
37 | * // bundleInFreeDebug: true,
38 | * // bundleInPaidRelease: true,
39 | * // bundleInBeta: true,
40 | *
41 | * // whether to disable dev mode in custom build variants (by default only disabled in release)
42 | * // for example: to disable dev mode in the staging build type (if configured)
43 | * devDisabledInStaging: true,
44 | * // The configuration property can be in the following formats
45 | * // 'devDisabledIn${productFlavor}${buildType}'
46 | * // 'devDisabledIn${buildType}'
47 | *
48 | * // the root of your project, i.e. where "package.json" lives
49 | * root: "../../",
50 | *
51 | * // where to put the JS bundle asset in debug mode
52 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug",
53 | *
54 | * // where to put the JS bundle asset in release mode
55 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release",
56 | *
57 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
58 | * // require('./image.png')), in debug mode
59 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug",
60 | *
61 | * // where to put drawable resources / React Native assets, e.g. the ones you use via
62 | * // require('./image.png')), in release mode
63 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release",
64 | *
65 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means
66 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to
67 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle
68 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/
69 | * // for example, you might want to remove it from here.
70 | * inputExcludes: ["android/**", "ios/**"],
71 | *
72 | * // override which node gets called and with what additional arguments
73 | * nodeExecutableAndArgs: ["node"],
74 | *
75 | * // supply additional arguments to the packager
76 | * extraPackagerArgs: []
77 | * ]
78 | */
79 |
80 | project.ext.react = [
81 | enableHermes: true, // clean and rebuild if changing
82 | ]
83 |
84 | apply from: "../../node_modules/react-native/react.gradle"
85 |
86 | /**
87 | * Set this to true to create two separate APKs instead of one:
88 | * - An APK that only works on ARM devices
89 | * - An APK that only works on x86 devices
90 | * The advantage is the size of the APK is reduced by about 4MB.
91 | * Upload all the APKs to the Play Store and people will download
92 | * the correct one based on the CPU architecture of their device.
93 | */
94 | def enableSeparateBuildPerCPUArchitecture = false
95 |
96 | /**
97 | * Run Proguard to shrink the Java bytecode in release builds.
98 | */
99 | def enableProguardInReleaseBuilds = false
100 |
101 | /**
102 | * The preferred build flavor of JavaScriptCore.
103 | *
104 | * For example, to use the international variant, you can use:
105 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'`
106 | *
107 | * The international variant includes ICU i18n library and necessary data
108 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that
109 | * give correct results when using with locales other than en-US. Note that
110 | * this variant is about 6MiB larger per architecture than default.
111 | */
112 | def jscFlavor = 'org.webkit:android-jsc:+'
113 |
114 | /**
115 | * Whether to enable the Hermes VM.
116 | *
117 | * This should be set on project.ext.react and that value will be read here. If it is not set
118 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode
119 | * and the benefits of using Hermes will therefore be sharply reduced.
120 | */
121 | def enableHermes = project.ext.react.get("enableHermes", false);
122 |
123 | /**
124 | * Architectures to build native code for in debug.
125 | */
126 | def nativeArchitectures = project.getProperties().get("reactNativeDebugArchitectures")
127 |
128 | android {
129 | ndkVersion rootProject.ext.ndkVersion
130 |
131 | compileSdkVersion rootProject.ext.compileSdkVersion
132 |
133 | defaultConfig {
134 | applicationId "com.appart"
135 | minSdkVersion rootProject.ext.minSdkVersion
136 | targetSdkVersion rootProject.ext.targetSdkVersion
137 | versionCode 1
138 | versionName "1.0"
139 | }
140 | splits {
141 | abi {
142 | reset()
143 | enable enableSeparateBuildPerCPUArchitecture
144 | universalApk false // If true, also generate a universal APK
145 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
146 | }
147 | }
148 | signingConfigs {
149 | debug {
150 | storeFile file('debug.keystore')
151 | storePassword 'android'
152 | keyAlias 'androiddebugkey'
153 | keyPassword 'android'
154 | }
155 | }
156 | buildTypes {
157 | debug {
158 | signingConfig signingConfigs.debug
159 | if (nativeArchitectures) {
160 | ndk {
161 | abiFilters nativeArchitectures.split(',')
162 | }
163 | }
164 | }
165 | release {
166 | // Caution! In production, you need to generate your own keystore file.
167 | // see https://reactnative.dev/docs/signed-apk-android.
168 | signingConfig signingConfigs.debug
169 | minifyEnabled enableProguardInReleaseBuilds
170 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
171 | }
172 | }
173 |
174 | // applicationVariants are e.g. debug, release
175 | applicationVariants.all { variant ->
176 | variant.outputs.each { output ->
177 | // For each separate APK per architecture, set a unique version code as described here:
178 | // https://developer.android.com/studio/build/configure-apk-splits.html
179 | // Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
180 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
181 | def abi = output.getFilter(OutputFile.ABI)
182 | if (abi != null) { // null for the universal-debug, universal-release variants
183 | output.versionCodeOverride =
184 | defaultConfig.versionCode * 1000 + versionCodes.get(abi)
185 | }
186 |
187 | }
188 | }
189 | }
190 |
191 | dependencies {
192 | implementation fileTree(dir: "libs", include: ["*.jar"])
193 | //noinspection GradleDynamicVersion
194 | implementation "com.facebook.react:react-native:+" // From node_modules
195 |
196 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
197 |
198 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
199 | exclude group:'com.facebook.fbjni'
200 | }
201 |
202 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
203 | exclude group:'com.facebook.flipper'
204 | exclude group:'com.squareup.okhttp3', module:'okhttp'
205 | }
206 |
207 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
208 | exclude group:'com.facebook.flipper'
209 | }
210 |
211 | if (enableHermes) {
212 | def hermesPath = "../../node_modules/hermes-engine/android/";
213 | debugImplementation files(hermesPath + "hermes-debug.aar")
214 | releaseImplementation files(hermesPath + "hermes-release.aar")
215 | } else {
216 | implementation jscFlavor
217 | }
218 | }
219 |
220 | // Run this once to be able to run the application with BUCK
221 | // puts all compile dependencies into folder libs for BUCK to use
222 | task copyDownloadableDepsToLibs(type: Copy) {
223 | from configurations.implementation
224 | into 'libs'
225 | }
226 |
227 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
228 |
--------------------------------------------------------------------------------
/src/assets/animations/red-spinner.json:
--------------------------------------------------------------------------------
1 | {
2 | "v": "5.5.5",
3 | "fr": 25,
4 | "ip": 0,
5 | "op": 91,
6 | "w": 300,
7 | "h": 150,
8 | "nm": "Loading-1",
9 | "ddd": 0,
10 | "assets": [],
11 | "layers": [
12 | {
13 | "ddd": 0,
14 | "ind": 1,
15 | "ty": 4,
16 | "nm": "Layer 1 Outlines",
17 | "sr": 1,
18 | "ks": {
19 | "o": {
20 | "a": 1,
21 | "k": [
22 | {
23 | "i": { "x": [0.833], "y": [0.833] },
24 | "o": { "x": [0.167], "y": [0.167] },
25 | "t": 0,
26 | "s": [20]
27 | },
28 | {
29 | "i": { "x": [0.833], "y": [0.833] },
30 | "o": { "x": [0.167], "y": [0.167] },
31 | "t": 5,
32 | "s": [100]
33 | },
34 | {
35 | "i": { "x": [0.833], "y": [0.833] },
36 | "o": { "x": [0.167], "y": [0.167] },
37 | "t": 10,
38 | "s": [20]
39 | },
40 | {
41 | "i": { "x": [0.833], "y": [0.833] },
42 | "o": { "x": [0.167], "y": [0.167] },
43 | "t": 20,
44 | "s": [20]
45 | },
46 | {
47 | "i": { "x": [0.833], "y": [0.833] },
48 | "o": { "x": [0.167], "y": [0.167] },
49 | "t": 25,
50 | "s": [100]
51 | },
52 | {
53 | "i": { "x": [0.833], "y": [0.833] },
54 | "o": { "x": [0.167], "y": [0.167] },
55 | "t": 30,
56 | "s": [20]
57 | },
58 | {
59 | "i": { "x": [0.833], "y": [0.833] },
60 | "o": { "x": [0.167], "y": [0.167] },
61 | "t": 40,
62 | "s": [20]
63 | },
64 | {
65 | "i": { "x": [0.833], "y": [0.833] },
66 | "o": { "x": [0.167], "y": [0.167] },
67 | "t": 45,
68 | "s": [100]
69 | },
70 | {
71 | "i": { "x": [0.833], "y": [0.833] },
72 | "o": { "x": [0.167], "y": [0.167] },
73 | "t": 50,
74 | "s": [20]
75 | },
76 | {
77 | "i": { "x": [0.833], "y": [0.833] },
78 | "o": { "x": [0.167], "y": [0.167] },
79 | "t": 60,
80 | "s": [20]
81 | },
82 | {
83 | "i": { "x": [0.833], "y": [0.833] },
84 | "o": { "x": [0.167], "y": [0.167] },
85 | "t": 65,
86 | "s": [100]
87 | },
88 | { "t": 70, "s": [20] }
89 | ],
90 | "ix": 11
91 | },
92 | "r": { "a": 0, "k": 0, "ix": 10 },
93 | "p": { "a": 0, "k": [133, 58, 0], "ix": 2 },
94 | "a": { "a": 0, "k": [15.25, 15.25, 0], "ix": 1 },
95 | "s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
96 | },
97 | "ao": 0,
98 | "shapes": [
99 | {
100 | "ty": "gr",
101 | "it": [
102 | {
103 | "ind": 0,
104 | "ty": "sh",
105 | "ix": 1,
106 | "ks": {
107 | "a": 0,
108 | "k": {
109 | "i": [
110 | [0, 0],
111 | [0, 0],
112 | [0, 0],
113 | [0, 0]
114 | ],
115 | "o": [
116 | [0, 0],
117 | [0, 0],
118 | [0, 0],
119 | [0, 0]
120 | ],
121 | "v": [
122 | [15, 15],
123 | [-15, 15],
124 | [-15, -15],
125 | [15, -15]
126 | ],
127 | "c": true
128 | },
129 | "ix": 2
130 | },
131 | "nm": "Path 1",
132 | "mn": "ADBE Vector Shape - Group",
133 | "hd": false
134 | },
135 | {
136 | "ty": "fl",
137 | "c": {
138 | "a": 0,
139 | "k": [
140 | 0.7607843137254902, 0.0392156862745098,
141 | 0.16470588235294117, 1
142 | ],
143 | "ix": 4
144 | },
145 | "o": { "a": 0, "k": 100, "ix": 5 },
146 | "r": 1,
147 | "bm": 0,
148 | "nm": "Fill 1",
149 | "mn": "ADBE Vector Graphic - Fill",
150 | "hd": false
151 | },
152 | {
153 | "ty": "tr",
154 | "p": { "a": 0, "k": [15.25, 15.25], "ix": 2 },
155 | "a": { "a": 0, "k": [0, 0], "ix": 1 },
156 | "s": { "a": 0, "k": [100, 100], "ix": 3 },
157 | "r": { "a": 0, "k": 0, "ix": 6 },
158 | "o": { "a": 0, "k": 100, "ix": 7 },
159 | "sk": { "a": 0, "k": 0, "ix": 4 },
160 | "sa": { "a": 0, "k": 0, "ix": 5 },
161 | "nm": "Transform"
162 | }
163 | ],
164 | "nm": "Group 1",
165 | "np": 2,
166 | "cix": 2,
167 | "bm": 0,
168 | "ix": 1,
169 | "mn": "ADBE Vector Group",
170 | "hd": false
171 | }
172 | ],
173 | "ip": 0,
174 | "op": 100,
175 | "st": 0,
176 | "bm": 0
177 | },
178 | {
179 | "ddd": 0,
180 | "ind": 2,
181 | "ty": 4,
182 | "nm": "Layer 2 Outlines",
183 | "sr": 1,
184 | "ks": {
185 | "o": {
186 | "a": 1,
187 | "k": [
188 | {
189 | "i": { "x": [0.833], "y": [0.833] },
190 | "o": { "x": [0.167], "y": [0.167] },
191 | "t": 5,
192 | "s": [20]
193 | },
194 | {
195 | "i": { "x": [0.833], "y": [0.833] },
196 | "o": { "x": [0.167], "y": [0.167] },
197 | "t": 10,
198 | "s": [100]
199 | },
200 | {
201 | "i": { "x": [0.833], "y": [0.833] },
202 | "o": { "x": [0.167], "y": [0.167] },
203 | "t": 15,
204 | "s": [20]
205 | },
206 | {
207 | "i": { "x": [0.833], "y": [0.833] },
208 | "o": { "x": [0.167], "y": [0.167] },
209 | "t": 25,
210 | "s": [20]
211 | },
212 | {
213 | "i": { "x": [0.833], "y": [0.833] },
214 | "o": { "x": [0.167], "y": [0.167] },
215 | "t": 30,
216 | "s": [100]
217 | },
218 | {
219 | "i": { "x": [0.833], "y": [0.833] },
220 | "o": { "x": [0.167], "y": [0.167] },
221 | "t": 35,
222 | "s": [20]
223 | },
224 | {
225 | "i": { "x": [0.833], "y": [0.833] },
226 | "o": { "x": [0.167], "y": [0.167] },
227 | "t": 45,
228 | "s": [20]
229 | },
230 | {
231 | "i": { "x": [0.833], "y": [0.833] },
232 | "o": { "x": [0.167], "y": [0.167] },
233 | "t": 50,
234 | "s": [100]
235 | },
236 | {
237 | "i": { "x": [0.833], "y": [0.833] },
238 | "o": { "x": [0.167], "y": [0.167] },
239 | "t": 55,
240 | "s": [20]
241 | },
242 | {
243 | "i": { "x": [0.833], "y": [0.833] },
244 | "o": { "x": [0.167], "y": [0.167] },
245 | "t": 65,
246 | "s": [20]
247 | },
248 | {
249 | "i": { "x": [0.833], "y": [0.833] },
250 | "o": { "x": [0.167], "y": [0.167] },
251 | "t": 70,
252 | "s": [100]
253 | },
254 | { "t": 75, "s": [20] }
255 | ],
256 | "ix": 11
257 | },
258 | "r": { "a": 0, "k": 0, "ix": 10 },
259 | "p": { "a": 0, "k": [167, 58, 0], "ix": 2 },
260 | "a": { "a": 0, "k": [15.25, 15.25, 0], "ix": 1 },
261 | "s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
262 | },
263 | "ao": 0,
264 | "shapes": [
265 | {
266 | "ty": "gr",
267 | "it": [
268 | {
269 | "ind": 0,
270 | "ty": "sh",
271 | "ix": 1,
272 | "ks": {
273 | "a": 0,
274 | "k": {
275 | "i": [
276 | [0, 0],
277 | [0, 0],
278 | [0, 0],
279 | [0, 0]
280 | ],
281 | "o": [
282 | [0, 0],
283 | [0, 0],
284 | [0, 0],
285 | [0, 0]
286 | ],
287 | "v": [
288 | [15, 15],
289 | [-15, 15],
290 | [-15, -15],
291 | [15, -15]
292 | ],
293 | "c": true
294 | },
295 | "ix": 2
296 | },
297 | "nm": "Path 1",
298 | "mn": "ADBE Vector Shape - Group",
299 | "hd": false
300 | },
301 | {
302 | "ty": "fl",
303 | "c": {
304 | "a": 0,
305 | "k": [
306 | 0.7607843137254902, 0.0392156862745098,
307 | 0.16470588235294117, 1
308 | ],
309 | "ix": 4
310 | },
311 | "o": { "a": 0, "k": 100, "ix": 5 },
312 | "r": 1,
313 | "bm": 0,
314 | "nm": "Fill 1",
315 | "mn": "ADBE Vector Graphic - Fill",
316 | "hd": false
317 | },
318 | {
319 | "ty": "tr",
320 | "p": { "a": 0, "k": [15.25, 15.25], "ix": 2 },
321 | "a": { "a": 0, "k": [0, 0], "ix": 1 },
322 | "s": { "a": 0, "k": [100, 100], "ix": 3 },
323 | "r": { "a": 0, "k": 0, "ix": 6 },
324 | "o": { "a": 0, "k": 100, "ix": 7 },
325 | "sk": { "a": 0, "k": 0, "ix": 4 },
326 | "sa": { "a": 0, "k": 0, "ix": 5 },
327 | "nm": "Transform"
328 | }
329 | ],
330 | "nm": "Group 1",
331 | "np": 2,
332 | "cix": 2,
333 | "bm": 0,
334 | "ix": 1,
335 | "mn": "ADBE Vector Group",
336 | "hd": false
337 | }
338 | ],
339 | "ip": 5,
340 | "op": 105,
341 | "st": 5,
342 | "bm": 0
343 | },
344 | {
345 | "ddd": 0,
346 | "ind": 3,
347 | "ty": 4,
348 | "nm": "Layer 3 Outlines",
349 | "sr": 1,
350 | "ks": {
351 | "o": {
352 | "a": 1,
353 | "k": [
354 | {
355 | "i": { "x": [0.833], "y": [0.833] },
356 | "o": { "x": [0.167], "y": [0.167] },
357 | "t": 10,
358 | "s": [20]
359 | },
360 | {
361 | "i": { "x": [0.833], "y": [0.833] },
362 | "o": { "x": [0.167], "y": [0.167] },
363 | "t": 15,
364 | "s": [100]
365 | },
366 | {
367 | "i": { "x": [0.833], "y": [0.833] },
368 | "o": { "x": [0.167], "y": [0.167] },
369 | "t": 20,
370 | "s": [20]
371 | },
372 | {
373 | "i": { "x": [0.833], "y": [0.833] },
374 | "o": { "x": [0.167], "y": [0.167] },
375 | "t": 30,
376 | "s": [20]
377 | },
378 | {
379 | "i": { "x": [0.833], "y": [0.833] },
380 | "o": { "x": [0.167], "y": [0.167] },
381 | "t": 35,
382 | "s": [100]
383 | },
384 | {
385 | "i": { "x": [0.833], "y": [0.833] },
386 | "o": { "x": [0.167], "y": [0.167] },
387 | "t": 40,
388 | "s": [20]
389 | },
390 | {
391 | "i": { "x": [0.833], "y": [0.833] },
392 | "o": { "x": [0.167], "y": [0.167] },
393 | "t": 50,
394 | "s": [20]
395 | },
396 | {
397 | "i": { "x": [0.833], "y": [0.833] },
398 | "o": { "x": [0.167], "y": [0.167] },
399 | "t": 55,
400 | "s": [100]
401 | },
402 | {
403 | "i": { "x": [0.833], "y": [0.833] },
404 | "o": { "x": [0.167], "y": [0.167] },
405 | "t": 60,
406 | "s": [20]
407 | },
408 | {
409 | "i": { "x": [0.833], "y": [0.833] },
410 | "o": { "x": [0.167], "y": [0.167] },
411 | "t": 70,
412 | "s": [20]
413 | },
414 | {
415 | "i": { "x": [0.833], "y": [0.833] },
416 | "o": { "x": [0.167], "y": [0.167] },
417 | "t": 75,
418 | "s": [100]
419 | },
420 | { "t": 80, "s": [20] }
421 | ],
422 | "ix": 11
423 | },
424 | "r": { "a": 0, "k": 0, "ix": 10 },
425 | "p": { "a": 0, "k": [167, 92, 0], "ix": 2 },
426 | "a": { "a": 0, "k": [15.25, 15.25, 0], "ix": 1 },
427 | "s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
428 | },
429 | "ao": 0,
430 | "shapes": [
431 | {
432 | "ty": "gr",
433 | "it": [
434 | {
435 | "ind": 0,
436 | "ty": "sh",
437 | "ix": 1,
438 | "ks": {
439 | "a": 0,
440 | "k": {
441 | "i": [
442 | [0, 0],
443 | [0, 0],
444 | [0, 0],
445 | [0, 0]
446 | ],
447 | "o": [
448 | [0, 0],
449 | [0, 0],
450 | [0, 0],
451 | [0, 0]
452 | ],
453 | "v": [
454 | [15, 15],
455 | [-15, 15],
456 | [-15, -15],
457 | [15, -15]
458 | ],
459 | "c": true
460 | },
461 | "ix": 2
462 | },
463 | "nm": "Path 1",
464 | "mn": "ADBE Vector Shape - Group",
465 | "hd": false
466 | },
467 | {
468 | "ty": "fl",
469 | "c": {
470 | "a": 0,
471 | "k": [
472 | 0.7607843137254902, 0.0392156862745098,
473 | 0.16470588235294117, 1
474 | ],
475 | "ix": 4
476 | },
477 | "o": { "a": 0, "k": 100, "ix": 5 },
478 | "r": 1,
479 | "bm": 0,
480 | "nm": "Fill 1",
481 | "mn": "ADBE Vector Graphic - Fill",
482 | "hd": false
483 | },
484 | {
485 | "ty": "tr",
486 | "p": { "a": 0, "k": [15.25, 15.25], "ix": 2 },
487 | "a": { "a": 0, "k": [0, 0], "ix": 1 },
488 | "s": { "a": 0, "k": [100, 100], "ix": 3 },
489 | "r": { "a": 0, "k": 0, "ix": 6 },
490 | "o": { "a": 0, "k": 100, "ix": 7 },
491 | "sk": { "a": 0, "k": 0, "ix": 4 },
492 | "sa": { "a": 0, "k": 0, "ix": 5 },
493 | "nm": "Transform"
494 | }
495 | ],
496 | "nm": "Group 1",
497 | "np": 2,
498 | "cix": 2,
499 | "bm": 0,
500 | "ix": 1,
501 | "mn": "ADBE Vector Group",
502 | "hd": false
503 | }
504 | ],
505 | "ip": 10,
506 | "op": 110,
507 | "st": 10,
508 | "bm": 0
509 | },
510 | {
511 | "ddd": 0,
512 | "ind": 4,
513 | "ty": 4,
514 | "nm": "Layer 4 Outlines",
515 | "sr": 1,
516 | "ks": {
517 | "o": {
518 | "a": 1,
519 | "k": [
520 | {
521 | "i": { "x": [0.833], "y": [0.833] },
522 | "o": { "x": [0.167], "y": [0.167] },
523 | "t": 15,
524 | "s": [20]
525 | },
526 | {
527 | "i": { "x": [0.833], "y": [0.833] },
528 | "o": { "x": [0.167], "y": [0.167] },
529 | "t": 20,
530 | "s": [100]
531 | },
532 | {
533 | "i": { "x": [0.833], "y": [0.833] },
534 | "o": { "x": [0.167], "y": [0.167] },
535 | "t": 25,
536 | "s": [20]
537 | },
538 | {
539 | "i": { "x": [0.833], "y": [0.833] },
540 | "o": { "x": [0.167], "y": [0.167] },
541 | "t": 35,
542 | "s": [20]
543 | },
544 | {
545 | "i": { "x": [0.833], "y": [0.833] },
546 | "o": { "x": [0.167], "y": [0.167] },
547 | "t": 40,
548 | "s": [100]
549 | },
550 | {
551 | "i": { "x": [0.833], "y": [0.833] },
552 | "o": { "x": [0.167], "y": [0.167] },
553 | "t": 45,
554 | "s": [20]
555 | },
556 | {
557 | "i": { "x": [0.833], "y": [0.833] },
558 | "o": { "x": [0.167], "y": [0.167] },
559 | "t": 55,
560 | "s": [20]
561 | },
562 | {
563 | "i": { "x": [0.833], "y": [0.833] },
564 | "o": { "x": [0.167], "y": [0.167] },
565 | "t": 60,
566 | "s": [100]
567 | },
568 | {
569 | "i": { "x": [0.833], "y": [0.833] },
570 | "o": { "x": [0.167], "y": [0.167] },
571 | "t": 65,
572 | "s": [20]
573 | },
574 | {
575 | "i": { "x": [0.833], "y": [0.833] },
576 | "o": { "x": [0.167], "y": [0.167] },
577 | "t": 75,
578 | "s": [53]
579 | },
580 | {
581 | "i": { "x": [0.833], "y": [0.833] },
582 | "o": { "x": [0.167], "y": [0.167] },
583 | "t": 80,
584 | "s": [100]
585 | },
586 | { "t": 85, "s": [20] }
587 | ],
588 | "ix": 11
589 | },
590 | "r": { "a": 0, "k": 0, "ix": 10 },
591 | "p": { "a": 0, "k": [133, 92, 0], "ix": 2 },
592 | "a": { "a": 0, "k": [15.25, 15.25, 0], "ix": 1 },
593 | "s": { "a": 0, "k": [100, 100, 100], "ix": 6 }
594 | },
595 | "ao": 0,
596 | "shapes": [
597 | {
598 | "ty": "gr",
599 | "it": [
600 | {
601 | "ind": 0,
602 | "ty": "sh",
603 | "ix": 1,
604 | "ks": {
605 | "a": 0,
606 | "k": {
607 | "i": [
608 | [0, 0],
609 | [0, 0],
610 | [0, 0],
611 | [0, 0]
612 | ],
613 | "o": [
614 | [0, 0],
615 | [0, 0],
616 | [0, 0],
617 | [0, 0]
618 | ],
619 | "v": [
620 | [15, 15],
621 | [-15, 15],
622 | [-15, -15],
623 | [15, -15]
624 | ],
625 | "c": true
626 | },
627 | "ix": 2
628 | },
629 | "nm": "Path 1",
630 | "mn": "ADBE Vector Shape - Group",
631 | "hd": false
632 | },
633 | {
634 | "ty": "fl",
635 | "c": {
636 | "a": 0,
637 | "k": [
638 | 0.7607843137254902, 0.0392156862745098,
639 | 0.16470588235294117, 1
640 | ],
641 | "ix": 4
642 | },
643 | "o": { "a": 0, "k": 100, "ix": 5 },
644 | "r": 1,
645 | "bm": 0,
646 | "nm": "Fill 1",
647 | "mn": "ADBE Vector Graphic - Fill",
648 | "hd": false
649 | },
650 | {
651 | "ty": "tr",
652 | "p": { "a": 0, "k": [15.25, 15.25], "ix": 2 },
653 | "a": { "a": 0, "k": [0, 0], "ix": 1 },
654 | "s": { "a": 0, "k": [100, 100], "ix": 3 },
655 | "r": { "a": 0, "k": 0, "ix": 6 },
656 | "o": { "a": 0, "k": 100, "ix": 7 },
657 | "sk": { "a": 0, "k": 0, "ix": 4 },
658 | "sa": { "a": 0, "k": 0, "ix": 5 },
659 | "nm": "Transform"
660 | }
661 | ],
662 | "nm": "Group 1",
663 | "np": 2,
664 | "cix": 2,
665 | "bm": 0,
666 | "ix": 1,
667 | "mn": "ADBE Vector Group",
668 | "hd": false
669 | }
670 | ],
671 | "ip": 15,
672 | "op": 115,
673 | "st": 15,
674 | "bm": 0
675 | }
676 | ],
677 | "markers": []
678 | }
679 |
--------------------------------------------------------------------------------
/ios/appArt.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 54;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 00E356F31AD99517003FC87E /* appArtTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 00E356F21AD99517003FC87E /* appArtTests.m */; };
11 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; };
12 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; };
13 | 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; };
14 | 225D823028437EFD00463A61 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 225D822F28437EFD00463A61 /* GoogleService-Info.plist */; };
15 | 6172F2D35A4C3AA820D92908 /* libPods-appArt.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6423831EA8574132BED9D8CC /* libPods-appArt.a */; };
16 | 7EF68E3733C33B6898317E18 /* libPods-appArt-appArtTests.a in Frameworks */ = {isa = PBXBuildFile; fileRef = ABFE59519B596E51CEFDCCC0 /* libPods-appArt-appArtTests.a */; };
17 | 81AB9BB82411601600AC10FF /* BootSplash.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 81AB9BB72411601600AC10FF /* BootSplash.storyboard */; };
18 | /* End PBXBuildFile section */
19 |
20 | /* Begin PBXContainerItemProxy section */
21 | 00E356F41AD99517003FC87E /* PBXContainerItemProxy */ = {
22 | isa = PBXContainerItemProxy;
23 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */;
24 | proxyType = 1;
25 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A;
26 | remoteInfo = appArt;
27 | };
28 | /* End PBXContainerItemProxy section */
29 |
30 | /* Begin PBXFileReference section */
31 | 00E356EE1AD99517003FC87E /* appArtTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = appArtTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
32 | 00E356F11AD99517003FC87E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
33 | 00E356F21AD99517003FC87E /* appArtTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = appArtTests.m; sourceTree = ""; };
34 | 13B07F961A680F5B00A75B9A /* appArt.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = appArt.app; sourceTree = BUILT_PRODUCTS_DIR; };
35 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AppDelegate.h; path = appArt/AppDelegate.h; sourceTree = ""; };
36 | 13B07FB01A68108700A75B9A /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AppDelegate.m; path = appArt/AppDelegate.m; sourceTree = ""; };
37 | 13B07FB51A68108700A75B9A /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Images.xcassets; path = appArt/Images.xcassets; sourceTree = ""; };
38 | 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = appArt/Info.plist; sourceTree = ""; };
39 | 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = appArt/main.m; sourceTree = ""; };
40 | 1D0AE47A65C8663E3B452821 /* Pods-appArt-appArtTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-appArt-appArtTests.release.xcconfig"; path = "Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests.release.xcconfig"; sourceTree = ""; };
41 | 225D822F28437EFD00463A61 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
42 | 6423831EA8574132BED9D8CC /* libPods-appArt.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-appArt.a"; sourceTree = BUILT_PRODUCTS_DIR; };
43 | 6C97AB639B58BBB4B15BBE30 /* Pods-appArt-appArtTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-appArt-appArtTests.debug.xcconfig"; path = "Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests.debug.xcconfig"; sourceTree = ""; };
44 | 81AB9BB72411601600AC10FF /* BootSplash.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = BootSplash.storyboard; path = appArt/BootSplash.storyboard; sourceTree = ""; };
45 | ABFE59519B596E51CEFDCCC0 /* libPods-appArt-appArtTests.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-appArt-appArtTests.a"; sourceTree = BUILT_PRODUCTS_DIR; };
46 | C0A881CF5CF3F2B244570E2A /* Pods-appArt.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-appArt.debug.xcconfig"; path = "Target Support Files/Pods-appArt/Pods-appArt.debug.xcconfig"; sourceTree = ""; };
47 | D00AAFFCFCFDA5787532823F /* Pods-appArt.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-appArt.release.xcconfig"; path = "Target Support Files/Pods-appArt/Pods-appArt.release.xcconfig"; sourceTree = ""; };
48 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; };
49 | /* End PBXFileReference section */
50 |
51 | /* Begin PBXFrameworksBuildPhase section */
52 | 00E356EB1AD99517003FC87E /* Frameworks */ = {
53 | isa = PBXFrameworksBuildPhase;
54 | buildActionMask = 2147483647;
55 | files = (
56 | 7EF68E3733C33B6898317E18 /* libPods-appArt-appArtTests.a in Frameworks */,
57 | );
58 | runOnlyForDeploymentPostprocessing = 0;
59 | };
60 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = {
61 | isa = PBXFrameworksBuildPhase;
62 | buildActionMask = 2147483647;
63 | files = (
64 | 6172F2D35A4C3AA820D92908 /* libPods-appArt.a in Frameworks */,
65 | );
66 | runOnlyForDeploymentPostprocessing = 0;
67 | };
68 | /* End PBXFrameworksBuildPhase section */
69 |
70 | /* Begin PBXGroup section */
71 | 00E356EF1AD99517003FC87E /* appArtTests */ = {
72 | isa = PBXGroup;
73 | children = (
74 | 00E356F21AD99517003FC87E /* appArtTests.m */,
75 | 00E356F01AD99517003FC87E /* Supporting Files */,
76 | );
77 | path = appArtTests;
78 | sourceTree = "";
79 | };
80 | 00E356F01AD99517003FC87E /* Supporting Files */ = {
81 | isa = PBXGroup;
82 | children = (
83 | 00E356F11AD99517003FC87E /* Info.plist */,
84 | );
85 | name = "Supporting Files";
86 | sourceTree = "";
87 | };
88 | 13B07FAE1A68108700A75B9A /* appArt */ = {
89 | isa = PBXGroup;
90 | children = (
91 | 13B07FAF1A68108700A75B9A /* AppDelegate.h */,
92 | 13B07FB01A68108700A75B9A /* AppDelegate.m */,
93 | 13B07FB51A68108700A75B9A /* Images.xcassets */,
94 | 225D822F28437EFD00463A61 /* GoogleService-Info.plist */,
95 | 13B07FB61A68108700A75B9A /* Info.plist */,
96 | 81AB9BB72411601600AC10FF /* BootSplash.storyboard */,
97 | 13B07FB71A68108700A75B9A /* main.m */,
98 | );
99 | name = appArt;
100 | sourceTree = "";
101 | };
102 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = {
103 | isa = PBXGroup;
104 | children = (
105 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */,
106 | 6423831EA8574132BED9D8CC /* libPods-appArt.a */,
107 | ABFE59519B596E51CEFDCCC0 /* libPods-appArt-appArtTests.a */,
108 | );
109 | name = Frameworks;
110 | sourceTree = "";
111 | };
112 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = {
113 | isa = PBXGroup;
114 | children = (
115 | );
116 | name = Libraries;
117 | sourceTree = "";
118 | };
119 | 83CBB9F61A601CBA00E9B192 = {
120 | isa = PBXGroup;
121 | children = (
122 | 13B07FAE1A68108700A75B9A /* appArt */,
123 | 832341AE1AAA6A7D00B99B32 /* Libraries */,
124 | 00E356EF1AD99517003FC87E /* appArtTests */,
125 | 83CBBA001A601CBA00E9B192 /* Products */,
126 | 2D16E6871FA4F8E400B85C8A /* Frameworks */,
127 | E233CBF5F47BEE60B243DCF8 /* Pods */,
128 | );
129 | indentWidth = 2;
130 | sourceTree = "";
131 | tabWidth = 2;
132 | usesTabs = 0;
133 | };
134 | 83CBBA001A601CBA00E9B192 /* Products */ = {
135 | isa = PBXGroup;
136 | children = (
137 | 13B07F961A680F5B00A75B9A /* appArt.app */,
138 | 00E356EE1AD99517003FC87E /* appArtTests.xctest */,
139 | );
140 | name = Products;
141 | sourceTree = "";
142 | };
143 | E233CBF5F47BEE60B243DCF8 /* Pods */ = {
144 | isa = PBXGroup;
145 | children = (
146 | C0A881CF5CF3F2B244570E2A /* Pods-appArt.debug.xcconfig */,
147 | D00AAFFCFCFDA5787532823F /* Pods-appArt.release.xcconfig */,
148 | 6C97AB639B58BBB4B15BBE30 /* Pods-appArt-appArtTests.debug.xcconfig */,
149 | 1D0AE47A65C8663E3B452821 /* Pods-appArt-appArtTests.release.xcconfig */,
150 | );
151 | path = Pods;
152 | sourceTree = "";
153 | };
154 | /* End PBXGroup section */
155 |
156 | /* Begin PBXNativeTarget section */
157 | 00E356ED1AD99517003FC87E /* appArtTests */ = {
158 | isa = PBXNativeTarget;
159 | buildConfigurationList = 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "appArtTests" */;
160 | buildPhases = (
161 | A130D646172E58E1D159D8F2 /* [CP] Check Pods Manifest.lock */,
162 | 00E356EA1AD99517003FC87E /* Sources */,
163 | 00E356EB1AD99517003FC87E /* Frameworks */,
164 | 00E356EC1AD99517003FC87E /* Resources */,
165 | 077E01280D4B4AD18B2E1770 /* [CP] Embed Pods Frameworks */,
166 | 4E62BDF20514810D028A5FBF /* [CP] Copy Pods Resources */,
167 | );
168 | buildRules = (
169 | );
170 | dependencies = (
171 | 00E356F51AD99517003FC87E /* PBXTargetDependency */,
172 | );
173 | name = appArtTests;
174 | productName = appArtTests;
175 | productReference = 00E356EE1AD99517003FC87E /* appArtTests.xctest */;
176 | productType = "com.apple.product-type.bundle.unit-test";
177 | };
178 | 13B07F861A680F5B00A75B9A /* appArt */ = {
179 | isa = PBXNativeTarget;
180 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "appArt" */;
181 | buildPhases = (
182 | 3E482C27206C4DEF2FE45063 /* [CP] Check Pods Manifest.lock */,
183 | FD10A7F022414F080027D42C /* Start Packager */,
184 | 13B07F871A680F5B00A75B9A /* Sources */,
185 | 13B07F8C1A680F5B00A75B9A /* Frameworks */,
186 | 13B07F8E1A680F5B00A75B9A /* Resources */,
187 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */,
188 | C8AC78B0264D0F9F6F6D630E /* [CP] Embed Pods Frameworks */,
189 | ADC9DDC32298B72B3CF5DC8E /* [CP] Copy Pods Resources */,
190 | B1F9213B42FD64ABCC470BC5 /* [CP-User] [RNFB] Core Configuration */,
191 | );
192 | buildRules = (
193 | );
194 | dependencies = (
195 | );
196 | name = appArt;
197 | productName = appArt;
198 | productReference = 13B07F961A680F5B00A75B9A /* appArt.app */;
199 | productType = "com.apple.product-type.application";
200 | };
201 | /* End PBXNativeTarget section */
202 |
203 | /* Begin PBXProject section */
204 | 83CBB9F71A601CBA00E9B192 /* Project object */ = {
205 | isa = PBXProject;
206 | attributes = {
207 | LastUpgradeCheck = 1210;
208 | TargetAttributes = {
209 | 00E356ED1AD99517003FC87E = {
210 | CreatedOnToolsVersion = 6.2;
211 | TestTargetID = 13B07F861A680F5B00A75B9A;
212 | };
213 | 13B07F861A680F5B00A75B9A = {
214 | LastSwiftMigration = 1120;
215 | };
216 | };
217 | };
218 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "appArt" */;
219 | compatibilityVersion = "Xcode 12.0";
220 | developmentRegion = en;
221 | hasScannedForEncodings = 0;
222 | knownRegions = (
223 | en,
224 | Base,
225 | );
226 | mainGroup = 83CBB9F61A601CBA00E9B192;
227 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */;
228 | projectDirPath = "";
229 | projectRoot = "";
230 | targets = (
231 | 13B07F861A680F5B00A75B9A /* appArt */,
232 | 00E356ED1AD99517003FC87E /* appArtTests */,
233 | );
234 | };
235 | /* End PBXProject section */
236 |
237 | /* Begin PBXResourcesBuildPhase section */
238 | 00E356EC1AD99517003FC87E /* Resources */ = {
239 | isa = PBXResourcesBuildPhase;
240 | buildActionMask = 2147483647;
241 | files = (
242 | );
243 | runOnlyForDeploymentPostprocessing = 0;
244 | };
245 | 13B07F8E1A680F5B00A75B9A /* Resources */ = {
246 | isa = PBXResourcesBuildPhase;
247 | buildActionMask = 2147483647;
248 | files = (
249 | 81AB9BB82411601600AC10FF /* BootSplash.storyboard in Resources */,
250 | 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */,
251 | 225D823028437EFD00463A61 /* GoogleService-Info.plist in Resources */,
252 | );
253 | runOnlyForDeploymentPostprocessing = 0;
254 | };
255 | /* End PBXResourcesBuildPhase section */
256 |
257 | /* Begin PBXShellScriptBuildPhase section */
258 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = {
259 | isa = PBXShellScriptBuildPhase;
260 | buildActionMask = 2147483647;
261 | files = (
262 | );
263 | inputPaths = (
264 | );
265 | name = "Bundle React Native code and images";
266 | outputPaths = (
267 | );
268 | runOnlyForDeploymentPostprocessing = 0;
269 | shellPath = /bin/sh;
270 | shellScript = "set -e\n\nexport NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n";
271 | };
272 | 077E01280D4B4AD18B2E1770 /* [CP] Embed Pods Frameworks */ = {
273 | isa = PBXShellScriptBuildPhase;
274 | buildActionMask = 2147483647;
275 | files = (
276 | );
277 | inputFileListPaths = (
278 | "${PODS_ROOT}/Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests-frameworks-${CONFIGURATION}-input-files.xcfilelist",
279 | );
280 | name = "[CP] Embed Pods Frameworks";
281 | outputFileListPaths = (
282 | "${PODS_ROOT}/Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests-frameworks-${CONFIGURATION}-output-files.xcfilelist",
283 | );
284 | runOnlyForDeploymentPostprocessing = 0;
285 | shellPath = /bin/sh;
286 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests-frameworks.sh\"\n";
287 | showEnvVarsInLog = 0;
288 | };
289 | 3E482C27206C4DEF2FE45063 /* [CP] Check Pods Manifest.lock */ = {
290 | isa = PBXShellScriptBuildPhase;
291 | buildActionMask = 2147483647;
292 | files = (
293 | );
294 | inputFileListPaths = (
295 | );
296 | inputPaths = (
297 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
298 | "${PODS_ROOT}/Manifest.lock",
299 | );
300 | name = "[CP] Check Pods Manifest.lock";
301 | outputFileListPaths = (
302 | );
303 | outputPaths = (
304 | "$(DERIVED_FILE_DIR)/Pods-appArt-checkManifestLockResult.txt",
305 | );
306 | runOnlyForDeploymentPostprocessing = 0;
307 | shellPath = /bin/sh;
308 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
309 | showEnvVarsInLog = 0;
310 | };
311 | 4E62BDF20514810D028A5FBF /* [CP] Copy Pods Resources */ = {
312 | isa = PBXShellScriptBuildPhase;
313 | buildActionMask = 2147483647;
314 | files = (
315 | );
316 | inputFileListPaths = (
317 | "${PODS_ROOT}/Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests-resources-${CONFIGURATION}-input-files.xcfilelist",
318 | );
319 | name = "[CP] Copy Pods Resources";
320 | outputFileListPaths = (
321 | "${PODS_ROOT}/Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests-resources-${CONFIGURATION}-output-files.xcfilelist",
322 | );
323 | runOnlyForDeploymentPostprocessing = 0;
324 | shellPath = /bin/sh;
325 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-appArt-appArtTests/Pods-appArt-appArtTests-resources.sh\"\n";
326 | showEnvVarsInLog = 0;
327 | };
328 | A130D646172E58E1D159D8F2 /* [CP] Check Pods Manifest.lock */ = {
329 | isa = PBXShellScriptBuildPhase;
330 | buildActionMask = 2147483647;
331 | files = (
332 | );
333 | inputFileListPaths = (
334 | );
335 | inputPaths = (
336 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
337 | "${PODS_ROOT}/Manifest.lock",
338 | );
339 | name = "[CP] Check Pods Manifest.lock";
340 | outputFileListPaths = (
341 | );
342 | outputPaths = (
343 | "$(DERIVED_FILE_DIR)/Pods-appArt-appArtTests-checkManifestLockResult.txt",
344 | );
345 | runOnlyForDeploymentPostprocessing = 0;
346 | shellPath = /bin/sh;
347 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
348 | showEnvVarsInLog = 0;
349 | };
350 | ADC9DDC32298B72B3CF5DC8E /* [CP] Copy Pods Resources */ = {
351 | isa = PBXShellScriptBuildPhase;
352 | buildActionMask = 2147483647;
353 | files = (
354 | );
355 | inputFileListPaths = (
356 | "${PODS_ROOT}/Target Support Files/Pods-appArt/Pods-appArt-resources-${CONFIGURATION}-input-files.xcfilelist",
357 | );
358 | name = "[CP] Copy Pods Resources";
359 | outputFileListPaths = (
360 | "${PODS_ROOT}/Target Support Files/Pods-appArt/Pods-appArt-resources-${CONFIGURATION}-output-files.xcfilelist",
361 | );
362 | runOnlyForDeploymentPostprocessing = 0;
363 | shellPath = /bin/sh;
364 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-appArt/Pods-appArt-resources.sh\"\n";
365 | showEnvVarsInLog = 0;
366 | };
367 | B1F9213B42FD64ABCC470BC5 /* [CP-User] [RNFB] Core Configuration */ = {
368 | isa = PBXShellScriptBuildPhase;
369 | buildActionMask = 2147483647;
370 | files = (
371 | );
372 | inputPaths = (
373 | "$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)",
374 | );
375 | name = "[CP-User] [RNFB] Core Configuration";
376 | runOnlyForDeploymentPostprocessing = 0;
377 | shellPath = /bin/sh;
378 | shellScript = "#!/usr/bin/env bash\n#\n# Copyright (c) 2016-present Invertase Limited & Contributors\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this library except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\nset -e\n\n_MAX_LOOKUPS=2;\n_SEARCH_RESULT=''\n_RN_ROOT_EXISTS=''\n_CURRENT_LOOKUPS=1\n_JSON_ROOT=\"'react-native'\"\n_JSON_FILE_NAME='firebase.json'\n_JSON_OUTPUT_BASE64='e30=' # { }\n_CURRENT_SEARCH_DIR=${PROJECT_DIR}\n_PLIST_BUDDY=/usr/libexec/PlistBuddy\n_TARGET_PLIST=\"${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH}\"\n_DSYM_PLIST=\"${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Info.plist\"\n\n# plist arrays\n_PLIST_ENTRY_KEYS=()\n_PLIST_ENTRY_TYPES=()\n_PLIST_ENTRY_VALUES=()\n\nfunction setPlistValue {\n echo \"info: setting plist entry '$1' of type '$2' in file '$4'\"\n ${_PLIST_BUDDY} -c \"Add :$1 $2 '$3'\" $4 || echo \"info: '$1' already exists\"\n}\n\nfunction getFirebaseJsonKeyValue () {\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$1'); puts output[$_JSON_ROOT]['$2']\"\n else\n echo \"\"\n fi;\n}\n\nfunction jsonBoolToYesNo () {\n if [[ $1 == \"false\" ]]; then\n echo \"NO\"\n elif [[ $1 == \"true\" ]]; then\n echo \"YES\"\n else echo \"NO\"\n fi\n}\n\necho \"info: -> RNFB build script started\"\necho \"info: 1) Locating ${_JSON_FILE_NAME} file:\"\n\nif [[ -z ${_CURRENT_SEARCH_DIR} ]]; then\n _CURRENT_SEARCH_DIR=$(pwd)\nfi;\n\nwhile true; do\n _CURRENT_SEARCH_DIR=$(dirname \"$_CURRENT_SEARCH_DIR\")\n if [[ \"$_CURRENT_SEARCH_DIR\" == \"/\" ]] || [[ ${_CURRENT_LOOKUPS} -gt ${_MAX_LOOKUPS} ]]; then break; fi;\n echo \"info: ($_CURRENT_LOOKUPS of $_MAX_LOOKUPS) Searching in '$_CURRENT_SEARCH_DIR' for a ${_JSON_FILE_NAME} file.\"\n _SEARCH_RESULT=$(find \"$_CURRENT_SEARCH_DIR\" -maxdepth 2 -name ${_JSON_FILE_NAME} -print | /usr/bin/head -n 1)\n if [[ ${_SEARCH_RESULT} ]]; then\n echo \"info: ${_JSON_FILE_NAME} found at $_SEARCH_RESULT\"\n break;\n fi;\n _CURRENT_LOOKUPS=$((_CURRENT_LOOKUPS+1))\ndone\n\nif [[ ${_SEARCH_RESULT} ]]; then\n _JSON_OUTPUT_RAW=$(cat \"${_SEARCH_RESULT}\")\n _RN_ROOT_EXISTS=$(ruby -e \"require 'rubygems';require 'json'; output=JSON.parse('$_JSON_OUTPUT_RAW'); puts output[$_JSON_ROOT]\" || echo '')\n\n if [[ ${_RN_ROOT_EXISTS} ]]; then\n if ! python3 --version >/dev/null 2>&1; then echo \"python3 not found, firebase.json file processing error.\" && exit 1; fi\n _JSON_OUTPUT_BASE64=$(python3 -c 'import json,sys,base64;print(base64.b64encode(bytes(json.dumps(json.loads(open('\"'${_SEARCH_RESULT}'\"', '\"'rb'\"').read())['${_JSON_ROOT}']), '\"'utf-8'\"')).decode())' || echo \"e30=\")\n fi\n\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n\n # config.app_data_collection_default_enabled\n _APP_DATA_COLLECTION_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_data_collection_default_enabled\")\n if [[ $_APP_DATA_COLLECTION_ENABLED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseDataCollectionDefaultEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_DATA_COLLECTION_ENABLED\")\")\n fi\n\n # config.analytics_auto_collection_enabled\n _ANALYTICS_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_auto_collection_enabled\")\n if [[ $_ANALYTICS_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_COLLECTION\")\")\n fi\n\n # config.analytics_collection_deactivated\n _ANALYTICS_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_collection_deactivated\")\n if [[ $_ANALYTICS_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"FIREBASE_ANALYTICS_COLLECTION_DEACTIVATED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_DEACTIVATED\")\")\n fi\n\n # config.analytics_idfv_collection_enabled\n _ANALYTICS_IDFV_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_idfv_collection_enabled\")\n if [[ $_ANALYTICS_IDFV_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_IDFV_COLLECTION_ENABLED\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_IDFV_COLLECTION\")\")\n fi\n\n # config.analytics_default_allow_ad_personalization_signals\n _ANALYTICS_PERSONALIZATION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"analytics_default_allow_ad_personalization_signals\")\n if [[ $_ANALYTICS_PERSONALIZATION ]]; then\n _PLIST_ENTRY_KEYS+=(\"GOOGLE_ANALYTICS_DEFAULT_ALLOW_AD_PERSONALIZATION_SIGNALS\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_PERSONALIZATION\")\")\n fi\n\n # config.google_analytics_automatic_screen_reporting_enabled\n _ANALYTICS_AUTO_SCREEN_REPORTING=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"google_analytics_automatic_screen_reporting_enabled\")\n if [[ $_ANALYTICS_AUTO_SCREEN_REPORTING ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAutomaticScreenReportingEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_ANALYTICS_AUTO_SCREEN_REPORTING\")\")\n fi\n\n # config.perf_auto_collection_enabled\n _PERF_AUTO_COLLECTION=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_auto_collection_enabled\")\n if [[ $_PERF_AUTO_COLLECTION ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_enabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_AUTO_COLLECTION\")\")\n fi\n\n # config.perf_collection_deactivated\n _PERF_DEACTIVATED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"perf_collection_deactivated\")\n if [[ $_PERF_DEACTIVATED ]]; then\n _PLIST_ENTRY_KEYS+=(\"firebase_performance_collection_deactivated\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_PERF_DEACTIVATED\")\")\n fi\n\n # config.messaging_auto_init_enabled\n _MESSAGING_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"messaging_auto_init_enabled\")\n if [[ $_MESSAGING_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseMessagingAutoInitEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_MESSAGING_AUTO_INIT\")\")\n fi\n\n # config.in_app_messaging_auto_colllection_enabled\n _FIAM_AUTO_INIT=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"in_app_messaging_auto_collection_enabled\")\n if [[ $_FIAM_AUTO_INIT ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseInAppMessagingAutomaticDataCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_FIAM_AUTO_INIT\")\")\n fi\n\n # config.app_check_token_auto_refresh\n _APP_CHECK_TOKEN_AUTO_REFRESH=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"app_check_token_auto_refresh\")\n if [[ $_APP_CHECK_TOKEN_AUTO_REFRESH ]]; then\n _PLIST_ENTRY_KEYS+=(\"FirebaseAppCheckTokenAutoRefreshEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"$(jsonBoolToYesNo \"$_APP_CHECK_TOKEN_AUTO_REFRESH\")\")\n fi\n\n # config.crashlytics_disable_auto_disabler - undocumented for now - mainly for debugging, document if becomes useful\n _CRASHLYTICS_AUTO_DISABLE_ENABLED=$(getFirebaseJsonKeyValue \"$_JSON_OUTPUT_RAW\" \"crashlytics_disable_auto_disabler\")\n if [[ $_CRASHLYTICS_AUTO_DISABLE_ENABLED == \"true\" ]]; then\n echo \"Disabled Crashlytics auto disabler.\" # do nothing\n else\n _PLIST_ENTRY_KEYS+=(\"FirebaseCrashlyticsCollectionEnabled\")\n _PLIST_ENTRY_TYPES+=(\"bool\")\n _PLIST_ENTRY_VALUES+=(\"NO\")\n fi\nelse\n _PLIST_ENTRY_KEYS+=(\"firebase_json_raw\")\n _PLIST_ENTRY_TYPES+=(\"string\")\n _PLIST_ENTRY_VALUES+=(\"$_JSON_OUTPUT_BASE64\")\n echo \"warning: A firebase.json file was not found, whilst this file is optional it is recommended to include it to configure firebase services in React Native Firebase.\"\nfi;\n\necho \"info: 2) Injecting Info.plist entries: \"\n\n# Log out the keys we're adding\nfor i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n echo \" -> $i) ${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\"\ndone\n\nfor plist in \"${_TARGET_PLIST}\" \"${_DSYM_PLIST}\" ; do\n if [[ -f \"${plist}\" ]]; then\n\n # paths with spaces break the call to setPlistValue. temporarily modify\n # the shell internal field separator variable (IFS), which normally\n # includes spaces, to consist only of line breaks\n oldifs=$IFS\n IFS=\"\n\"\n\n for i in \"${!_PLIST_ENTRY_KEYS[@]}\"; do\n setPlistValue \"${_PLIST_ENTRY_KEYS[$i]}\" \"${_PLIST_ENTRY_TYPES[$i]}\" \"${_PLIST_ENTRY_VALUES[$i]}\" \"${plist}\"\n done\n\n # restore the original internal field separator value\n IFS=$oldifs\n else\n echo \"warning: A Info.plist build output file was not found (${plist})\"\n fi\ndone\n\necho \"info: <- RNFB build script finished\"\n";
379 | };
380 | C8AC78B0264D0F9F6F6D630E /* [CP] Embed Pods Frameworks */ = {
381 | isa = PBXShellScriptBuildPhase;
382 | buildActionMask = 2147483647;
383 | files = (
384 | );
385 | inputFileListPaths = (
386 | "${PODS_ROOT}/Target Support Files/Pods-appArt/Pods-appArt-frameworks-${CONFIGURATION}-input-files.xcfilelist",
387 | );
388 | name = "[CP] Embed Pods Frameworks";
389 | outputFileListPaths = (
390 | "${PODS_ROOT}/Target Support Files/Pods-appArt/Pods-appArt-frameworks-${CONFIGURATION}-output-files.xcfilelist",
391 | );
392 | runOnlyForDeploymentPostprocessing = 0;
393 | shellPath = /bin/sh;
394 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-appArt/Pods-appArt-frameworks.sh\"\n";
395 | showEnvVarsInLog = 0;
396 | };
397 | FD10A7F022414F080027D42C /* Start Packager */ = {
398 | isa = PBXShellScriptBuildPhase;
399 | buildActionMask = 2147483647;
400 | files = (
401 | );
402 | inputFileListPaths = (
403 | );
404 | inputPaths = (
405 | );
406 | name = "Start Packager";
407 | outputFileListPaths = (
408 | );
409 | outputPaths = (
410 | );
411 | runOnlyForDeploymentPostprocessing = 0;
412 | shellPath = /bin/sh;
413 | shellScript = "export RCT_METRO_PORT=\"${RCT_METRO_PORT:=8081}\"\necho \"export RCT_METRO_PORT=${RCT_METRO_PORT}\" > \"${SRCROOT}/../node_modules/react-native/scripts/.packager.env\"\nif [ -z \"${RCT_NO_LAUNCH_PACKAGER+xxx}\" ] ; then\n if nc -w 5 -z localhost ${RCT_METRO_PORT} ; then\n if ! curl -s \"http://localhost:${RCT_METRO_PORT}/status\" | grep -q \"packager-status:running\" ; then\n echo \"Port ${RCT_METRO_PORT} already in use, packager is either not running or not running correctly\"\n exit 2\n fi\n else\n open \"$SRCROOT/../node_modules/react-native/scripts/launchPackager.command\" || echo \"Can't start packager automatically\"\n fi\nfi\n";
414 | showEnvVarsInLog = 0;
415 | };
416 | /* End PBXShellScriptBuildPhase section */
417 |
418 | /* Begin PBXSourcesBuildPhase section */
419 | 00E356EA1AD99517003FC87E /* Sources */ = {
420 | isa = PBXSourcesBuildPhase;
421 | buildActionMask = 2147483647;
422 | files = (
423 | 00E356F31AD99517003FC87E /* appArtTests.m in Sources */,
424 | );
425 | runOnlyForDeploymentPostprocessing = 0;
426 | };
427 | 13B07F871A680F5B00A75B9A /* Sources */ = {
428 | isa = PBXSourcesBuildPhase;
429 | buildActionMask = 2147483647;
430 | files = (
431 | 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */,
432 | 13B07FC11A68108700A75B9A /* main.m in Sources */,
433 | );
434 | runOnlyForDeploymentPostprocessing = 0;
435 | };
436 | /* End PBXSourcesBuildPhase section */
437 |
438 | /* Begin PBXTargetDependency section */
439 | 00E356F51AD99517003FC87E /* PBXTargetDependency */ = {
440 | isa = PBXTargetDependency;
441 | target = 13B07F861A680F5B00A75B9A /* appArt */;
442 | targetProxy = 00E356F41AD99517003FC87E /* PBXContainerItemProxy */;
443 | };
444 | /* End PBXTargetDependency section */
445 |
446 | /* Begin XCBuildConfiguration section */
447 | 00E356F61AD99517003FC87E /* Debug */ = {
448 | isa = XCBuildConfiguration;
449 | baseConfigurationReference = 6C97AB639B58BBB4B15BBE30 /* Pods-appArt-appArtTests.debug.xcconfig */;
450 | buildSettings = {
451 | BUNDLE_LOADER = "$(TEST_HOST)";
452 | GCC_PREPROCESSOR_DEFINITIONS = (
453 | "DEBUG=1",
454 | "$(inherited)",
455 | );
456 | INFOPLIST_FILE = appArtTests/Info.plist;
457 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
458 | LD_RUNPATH_SEARCH_PATHS = (
459 | "$(inherited)",
460 | "@executable_path/Frameworks",
461 | "@loader_path/Frameworks",
462 | );
463 | OTHER_LDFLAGS = (
464 | "-ObjC",
465 | "-lc++",
466 | "$(inherited)",
467 | );
468 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
469 | PRODUCT_NAME = "$(TARGET_NAME)";
470 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/appArt.app/appArt";
471 | };
472 | name = Debug;
473 | };
474 | 00E356F71AD99517003FC87E /* Release */ = {
475 | isa = XCBuildConfiguration;
476 | baseConfigurationReference = 1D0AE47A65C8663E3B452821 /* Pods-appArt-appArtTests.release.xcconfig */;
477 | buildSettings = {
478 | BUNDLE_LOADER = "$(TEST_HOST)";
479 | COPY_PHASE_STRIP = NO;
480 | INFOPLIST_FILE = appArtTests/Info.plist;
481 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
482 | LD_RUNPATH_SEARCH_PATHS = (
483 | "$(inherited)",
484 | "@executable_path/Frameworks",
485 | "@loader_path/Frameworks",
486 | );
487 | OTHER_LDFLAGS = (
488 | "-ObjC",
489 | "-lc++",
490 | "$(inherited)",
491 | );
492 | PRODUCT_BUNDLE_IDENTIFIER = "org.reactjs.native.example.$(PRODUCT_NAME:rfc1034identifier)";
493 | PRODUCT_NAME = "$(TARGET_NAME)";
494 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/appArt.app/appArt";
495 | };
496 | name = Release;
497 | };
498 | 13B07F941A680F5B00A75B9A /* Debug */ = {
499 | isa = XCBuildConfiguration;
500 | baseConfigurationReference = C0A881CF5CF3F2B244570E2A /* Pods-appArt.debug.xcconfig */;
501 | buildSettings = {
502 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
503 | CLANG_ENABLE_MODULES = YES;
504 | CURRENT_PROJECT_VERSION = 1;
505 | DEVELOPMENT_TEAM = 994M36343R;
506 | ENABLE_BITCODE = NO;
507 | INFOPLIST_FILE = appArt/Info.plist;
508 | LD_RUNPATH_SEARCH_PATHS = (
509 | "$(inherited)",
510 | "@executable_path/Frameworks",
511 | );
512 | OTHER_LDFLAGS = (
513 | "$(inherited)",
514 | "-ObjC",
515 | "-lc++",
516 | );
517 | PRODUCT_BUNDLE_IDENTIFIER = kachurin.maxim.art;
518 | PRODUCT_NAME = appArt;
519 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
520 | SWIFT_VERSION = 5.0;
521 | VERSIONING_SYSTEM = "apple-generic";
522 | };
523 | name = Debug;
524 | };
525 | 13B07F951A680F5B00A75B9A /* Release */ = {
526 | isa = XCBuildConfiguration;
527 | baseConfigurationReference = D00AAFFCFCFDA5787532823F /* Pods-appArt.release.xcconfig */;
528 | buildSettings = {
529 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
530 | CLANG_ENABLE_MODULES = YES;
531 | CURRENT_PROJECT_VERSION = 1;
532 | DEVELOPMENT_TEAM = 994M36343R;
533 | INFOPLIST_FILE = appArt/Info.plist;
534 | LD_RUNPATH_SEARCH_PATHS = (
535 | "$(inherited)",
536 | "@executable_path/Frameworks",
537 | );
538 | OTHER_LDFLAGS = (
539 | "$(inherited)",
540 | "-ObjC",
541 | "-lc++",
542 | );
543 | PRODUCT_BUNDLE_IDENTIFIER = kachurin.maxim.art;
544 | PRODUCT_NAME = appArt;
545 | SWIFT_VERSION = 5.0;
546 | VERSIONING_SYSTEM = "apple-generic";
547 | };
548 | name = Release;
549 | };
550 | 83CBBA201A601CBA00E9B192 /* Debug */ = {
551 | isa = XCBuildConfiguration;
552 | buildSettings = {
553 | ALWAYS_SEARCH_USER_PATHS = NO;
554 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
555 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
556 | CLANG_CXX_LIBRARY = "libc++";
557 | CLANG_ENABLE_MODULES = YES;
558 | CLANG_ENABLE_OBJC_ARC = YES;
559 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
560 | CLANG_WARN_BOOL_CONVERSION = YES;
561 | CLANG_WARN_COMMA = YES;
562 | CLANG_WARN_CONSTANT_CONVERSION = YES;
563 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
564 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
565 | CLANG_WARN_EMPTY_BODY = YES;
566 | CLANG_WARN_ENUM_CONVERSION = YES;
567 | CLANG_WARN_INFINITE_RECURSION = YES;
568 | CLANG_WARN_INT_CONVERSION = YES;
569 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
570 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
571 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
572 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
573 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
574 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
575 | CLANG_WARN_STRICT_PROTOTYPES = YES;
576 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
577 | CLANG_WARN_UNREACHABLE_CODE = YES;
578 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
579 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
580 | COPY_PHASE_STRIP = NO;
581 | ENABLE_STRICT_OBJC_MSGSEND = YES;
582 | ENABLE_TESTABILITY = YES;
583 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
584 | GCC_C_LANGUAGE_STANDARD = gnu99;
585 | GCC_DYNAMIC_NO_PIC = NO;
586 | GCC_NO_COMMON_BLOCKS = YES;
587 | GCC_OPTIMIZATION_LEVEL = 0;
588 | GCC_PREPROCESSOR_DEFINITIONS = (
589 | "DEBUG=1",
590 | "$(inherited)",
591 | );
592 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
593 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
594 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
595 | GCC_WARN_UNDECLARED_SELECTOR = YES;
596 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
597 | GCC_WARN_UNUSED_FUNCTION = YES;
598 | GCC_WARN_UNUSED_VARIABLE = YES;
599 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
600 | LD_RUNPATH_SEARCH_PATHS = (
601 | /usr/lib/swift,
602 | "$(inherited)",
603 | );
604 | LIBRARY_SEARCH_PATHS = (
605 | "\"$(SDKROOT)/usr/lib/swift\"",
606 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
607 | "\"$(inherited)\"",
608 | );
609 | MTL_ENABLE_DEBUG_INFO = YES;
610 | ONLY_ACTIVE_ARCH = YES;
611 | SDKROOT = iphoneos;
612 | };
613 | name = Debug;
614 | };
615 | 83CBBA211A601CBA00E9B192 /* Release */ = {
616 | isa = XCBuildConfiguration;
617 | buildSettings = {
618 | ALWAYS_SEARCH_USER_PATHS = NO;
619 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
620 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
621 | CLANG_CXX_LIBRARY = "libc++";
622 | CLANG_ENABLE_MODULES = YES;
623 | CLANG_ENABLE_OBJC_ARC = YES;
624 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
625 | CLANG_WARN_BOOL_CONVERSION = YES;
626 | CLANG_WARN_COMMA = YES;
627 | CLANG_WARN_CONSTANT_CONVERSION = YES;
628 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
629 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
630 | CLANG_WARN_EMPTY_BODY = YES;
631 | CLANG_WARN_ENUM_CONVERSION = YES;
632 | CLANG_WARN_INFINITE_RECURSION = YES;
633 | CLANG_WARN_INT_CONVERSION = YES;
634 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
635 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
636 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
637 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
638 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
639 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
640 | CLANG_WARN_STRICT_PROTOTYPES = YES;
641 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
642 | CLANG_WARN_UNREACHABLE_CODE = YES;
643 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
644 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
645 | COPY_PHASE_STRIP = YES;
646 | ENABLE_NS_ASSERTIONS = NO;
647 | ENABLE_STRICT_OBJC_MSGSEND = YES;
648 | "EXCLUDED_ARCHS[sdk=iphonesimulator*]" = "";
649 | GCC_C_LANGUAGE_STANDARD = gnu99;
650 | GCC_NO_COMMON_BLOCKS = YES;
651 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
652 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
653 | GCC_WARN_UNDECLARED_SELECTOR = YES;
654 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
655 | GCC_WARN_UNUSED_FUNCTION = YES;
656 | GCC_WARN_UNUSED_VARIABLE = YES;
657 | IPHONEOS_DEPLOYMENT_TARGET = 11.0;
658 | LD_RUNPATH_SEARCH_PATHS = (
659 | /usr/lib/swift,
660 | "$(inherited)",
661 | );
662 | LIBRARY_SEARCH_PATHS = (
663 | "\"$(SDKROOT)/usr/lib/swift\"",
664 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"",
665 | "\"$(inherited)\"",
666 | );
667 | MTL_ENABLE_DEBUG_INFO = NO;
668 | SDKROOT = iphoneos;
669 | VALIDATE_PRODUCT = YES;
670 | };
671 | name = Release;
672 | };
673 | /* End XCBuildConfiguration section */
674 |
675 | /* Begin XCConfigurationList section */
676 | 00E357021AD99517003FC87E /* Build configuration list for PBXNativeTarget "appArtTests" */ = {
677 | isa = XCConfigurationList;
678 | buildConfigurations = (
679 | 00E356F61AD99517003FC87E /* Debug */,
680 | 00E356F71AD99517003FC87E /* Release */,
681 | );
682 | defaultConfigurationIsVisible = 0;
683 | defaultConfigurationName = Release;
684 | };
685 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "appArt" */ = {
686 | isa = XCConfigurationList;
687 | buildConfigurations = (
688 | 13B07F941A680F5B00A75B9A /* Debug */,
689 | 13B07F951A680F5B00A75B9A /* Release */,
690 | );
691 | defaultConfigurationIsVisible = 0;
692 | defaultConfigurationName = Release;
693 | };
694 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "appArt" */ = {
695 | isa = XCConfigurationList;
696 | buildConfigurations = (
697 | 83CBBA201A601CBA00E9B192 /* Debug */,
698 | 83CBBA211A601CBA00E9B192 /* Release */,
699 | );
700 | defaultConfigurationIsVisible = 0;
701 | defaultConfigurationName = Release;
702 | };
703 | /* End XCConfigurationList section */
704 | };
705 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */;
706 | }
707 |
--------------------------------------------------------------------------------