Vitalik
10 months ago
50 changed files with 492 additions and 249 deletions
@ -1,47 +1,47 @@ |
|||||||
{ |
{ |
||||||
"project_info": { |
"project_info": { |
||||||
"project_number": "552568521005", |
"project_number": "552568521005", |
||||||
"firebase_url": "https://truthordare-6493e-default-rtdb.europe-west1.firebasedatabase.app", |
"firebase_url": "https://truthordare-6493e-default-rtdb.europe-west1.firebasedatabase.app", |
||||||
"project_id": "truth-or-dare-fcc54", |
"project_id": "truth-or-dare-fcc54", |
||||||
"storage_bucket": "truthordare-6493e.appspot.com" |
"storage_bucket": "truthordare-6493e.appspot.com" |
||||||
}, |
}, |
||||||
"client": [ |
"client": [ |
||||||
{ |
{ |
||||||
"client_info": { |
"client_info": { |
||||||
"mobilesdk_app_id": "1:180425292880:android:8690e5274abb413c7da555", |
"mobilesdk_app_id": "1:180425292880:android:8690e5274abb413c7da555", |
||||||
"android_client_info": { |
"android_client_info": { |
||||||
"package_name": "com.truth" |
"package_name": "com.truthoraction.jetup" |
||||||
} |
} |
||||||
}, |
}, |
||||||
"oauth_client": [ |
"oauth_client": [ |
||||||
{ |
{ |
||||||
"client_id": "180425292880-1pfj1drhgqc9j19jit1ahfu7jouodjej.apps.googleusercontent.com", |
"client_id": "180425292880-1pfj1drhgqc9j19jit1ahfu7jouodjej.apps.googleusercontent.com", |
||||||
"client_type": 3 |
"client_type": 3 |
||||||
} |
} |
||||||
], |
], |
||||||
"api_key": [ |
"api_key": [ |
||||||
{ |
{ |
||||||
"current_key": "AIzaSyBXoidUFjbE84RZ8PqIP0IGAsTYU28PEO8" |
"current_key": "AIzaSyBXoidUFjbE84RZ8PqIP0IGAsTYU28PEO8" |
||||||
} |
} |
||||||
], |
], |
||||||
"services": { |
"services": { |
||||||
"appinvite_service": { |
"appinvite_service": { |
||||||
"other_platform_oauth_client": [ |
"other_platform_oauth_client": [ |
||||||
{ |
{ |
||||||
"client_id": "180425292880-1pfj1drhgqc9j19jit1ahfu7jouodjej.apps.googleusercontent.com", |
"client_id": "180425292880-1pfj1drhgqc9j19jit1ahfu7jouodjej.apps.googleusercontent.com", |
||||||
"client_type": 3 |
"client_type": 3 |
||||||
}, |
}, |
||||||
{ |
{ |
||||||
"client_id": "180425292880-bfueoq3p0oq0b0lf2qviebio2q338eu8.apps.googleusercontent.com", |
"client_id": "180425292880-bfueoq3p0oq0b0lf2qviebio2q338eu8.apps.googleusercontent.com", |
||||||
"client_type": 2, |
"client_type": 2, |
||||||
"ios_info": { |
"ios_info": { |
||||||
"bundle_id": "org.reactjs.native.example.Truth" |
"bundle_id": "org.reactjs.native.example.Truth" |
||||||
} |
} |
||||||
} |
} |
||||||
] |
] |
||||||
} |
} |
||||||
} |
} |
||||||
} |
} |
||||||
], |
], |
||||||
"configuration_version": "1" |
"configuration_version": "1" |
||||||
} |
} |
||||||
|
Binary file not shown.
@ -1,4 +1,4 @@ |
|||||||
package com.truth; |
package com.truthoraction.jetup; |
||||||
|
|
||||||
import android.os.Bundle; |
import android.os.Bundle; |
||||||
import com.facebook.react.ReactActivity; |
import com.facebook.react.ReactActivity; |
@ -1,4 +1,4 @@ |
|||||||
package com.truth; |
package com.truthoraction.jetup; |
||||||
|
|
||||||
import android.app.Application; |
import android.app.Application; |
||||||
import com.facebook.react.PackageList; |
import com.facebook.react.PackageList; |
Binary file not shown.
@ -1,3 +1,3 @@ |
|||||||
export enum ProductsEnum { |
export enum ProductsEnum { |
||||||
Crazy = 'Crz', |
Crazy = 'crz', |
||||||
} |
} |
||||||
|
@ -1,2 +1,2 @@ |
|||||||
export * from './truth-or-dare-view' |
export * from './truth-or-dare' |
||||||
export * from './player-field.component'; |
export * from './player-field.component'; |
||||||
|
@ -1,53 +0,0 @@ |
|||||||
import React, { useEffect } from 'react' |
|
||||||
import { Font, Icon, colors } from '../../common' |
|
||||||
import { Animated, StyleSheet } from 'react-native' |
|
||||||
import { useAnimationTruthOrDare } from '../animations' |
|
||||||
|
|
||||||
interface IProps { |
|
||||||
item: string |
|
||||||
} |
|
||||||
|
|
||||||
export const TruthOrDareView: React.FC<IProps> = ({ item }) => { |
|
||||||
const { animStyle, startAnimation } = useAnimationTruthOrDare() |
|
||||||
|
|
||||||
useEffect(() => { |
|
||||||
startAnimation() |
|
||||||
}, []) |
|
||||||
return ( |
|
||||||
<Animated.View style={[styles.container, animStyle]}> |
|
||||||
<Icon |
|
||||||
name="magic-star" |
|
||||||
size={24} |
|
||||||
color={colors.turquoise} |
|
||||||
style={styles.starIcon} |
|
||||||
/> |
|
||||||
<Animated.Text style={[styles.text]}>{item}</Animated.Text> |
|
||||||
</Animated.View> |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
const styles = StyleSheet.create({ |
|
||||||
container: { |
|
||||||
paddingHorizontal: 16, |
|
||||||
paddingVertical: 32, |
|
||||||
backgroundColor: colors.darkPurple, |
|
||||||
borderRadius: 20, |
|
||||||
alignItems: 'center', |
|
||||||
shadowColor: '#190f42', |
|
||||||
shadowOffset: { width: 0, height: 2 }, |
|
||||||
shadowOpacity: 1, |
|
||||||
shadowRadius: 4, |
|
||||||
elevation: 5, |
|
||||||
marginTop: 88, |
|
||||||
}, |
|
||||||
starIcon: { |
|
||||||
marginBottom: 14, |
|
||||||
}, |
|
||||||
text: { |
|
||||||
color: colors.purple, |
|
||||||
fontSize: 22, |
|
||||||
lineHeight: 32, |
|
||||||
textAlign: 'center', |
|
||||||
fontFamily: Font.Roboto400, |
|
||||||
}, |
|
||||||
}) |
|
@ -0,0 +1,104 @@ |
|||||||
|
import React, { useEffect, useState } from 'react' |
||||||
|
import { Font, Icon, StorageKey, colors, storageService } from '../../common' |
||||||
|
import { Animated, StyleSheet, View } from 'react-native' |
||||||
|
import { useAnimationTruthOrDare } from '../animations' |
||||||
|
import Tts from 'react-native-tts' |
||||||
|
|
||||||
|
interface IProps { |
||||||
|
item: string |
||||||
|
} |
||||||
|
|
||||||
|
export const TruthOrDare: React.FC<IProps> = ({ item }) => { |
||||||
|
const wordsArr = item.trim().split(' ') |
||||||
|
const [voiceover, setVoiceover] = useState(true) |
||||||
|
|
||||||
|
const { animStyle, animValues, startAnimationCard, startAnimTextByVoice } = |
||||||
|
useAnimationTruthOrDare(wordsArr) |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
startAnimationCard() |
||||||
|
|
||||||
|
checkAndStartVoiceover() |
||||||
|
}, [item]) |
||||||
|
|
||||||
|
const checkAndStartVoiceover = async () => { |
||||||
|
const isVoicer = await storageService.get(StorageKey.Voiceover) |
||||||
|
|
||||||
|
setVoiceover(isVoicer) |
||||||
|
|
||||||
|
if (isVoicer) { |
||||||
|
Tts.stop() |
||||||
|
Tts.speak(item) |
||||||
|
Tts.addEventListener('tts-start', startAnimTextByVoice) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
return ( |
||||||
|
<Animated.View style={[styles.container, animStyle]}> |
||||||
|
<Icon |
||||||
|
name="magic-star" |
||||||
|
size={24} |
||||||
|
color={colors.turquoise} |
||||||
|
style={styles.starIcon} |
||||||
|
/> |
||||||
|
<View style={styles.textWrap}> |
||||||
|
{wordsArr?.map((word, index) => { |
||||||
|
return ( |
||||||
|
<Animated.Text |
||||||
|
key={`${word} + ${index * word.length}`} |
||||||
|
style={[ |
||||||
|
styles.text, |
||||||
|
{ |
||||||
|
opacity: voiceover ? animValues[index] : 1, |
||||||
|
transform: [ |
||||||
|
{ |
||||||
|
translateX: voiceover |
||||||
|
? Animated.multiply( |
||||||
|
animValues[index], |
||||||
|
new Animated.Value(-5), |
||||||
|
) |
||||||
|
: 0, |
||||||
|
}, |
||||||
|
], |
||||||
|
}, |
||||||
|
]}> |
||||||
|
{word + ' '} |
||||||
|
</Animated.Text> |
||||||
|
) |
||||||
|
})} |
||||||
|
</View> |
||||||
|
</Animated.View> |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
const styles = StyleSheet.create({ |
||||||
|
container: { |
||||||
|
paddingLeft: 21, |
||||||
|
paddingRight: 11, |
||||||
|
paddingVertical: 32, |
||||||
|
backgroundColor: colors.darkPurple, |
||||||
|
borderRadius: 20, |
||||||
|
alignItems: 'center', |
||||||
|
shadowColor: '#190f42', |
||||||
|
shadowOffset: { width: 0, height: 2 }, |
||||||
|
shadowOpacity: 1, |
||||||
|
shadowRadius: 4, |
||||||
|
elevation: 5, |
||||||
|
marginTop: 88, |
||||||
|
}, |
||||||
|
textWrap: { |
||||||
|
flexDirection: 'row', |
||||||
|
flexWrap: 'wrap', |
||||||
|
justifyContent: 'center', |
||||||
|
}, |
||||||
|
starIcon: { |
||||||
|
marginBottom: 14, |
||||||
|
}, |
||||||
|
text: { |
||||||
|
color: colors.purple, |
||||||
|
fontSize: 22, |
||||||
|
lineHeight: 32, |
||||||
|
textAlign: 'center', |
||||||
|
fontFamily: Font.Roboto400, |
||||||
|
}, |
||||||
|
}) |
@ -1 +1,2 @@ |
|||||||
export * from './package-name.config'; |
export * from './package-name.config'; |
||||||
|
export * from './voice.config'; |
||||||
|
@ -0,0 +1,12 @@ |
|||||||
|
import { Language } from '~module/common' |
||||||
|
|
||||||
|
export const voiceConfig: any = { |
||||||
|
[Language.UA]: { |
||||||
|
language: 'uk-UA', |
||||||
|
voice: 'com.apple.voice.compact.uk-UA.Lesya', |
||||||
|
}, |
||||||
|
[Language.EN]: { |
||||||
|
language: 'en-US', |
||||||
|
voice: 'com.apple.ttsbundle.Samantha-compact', |
||||||
|
}, |
||||||
|
} |
@ -1,2 +1,3 @@ |
|||||||
export * from './get-current-truth-dares.hook' |
export * from './get-current-truth-dares.hook' |
||||||
export * from './use-set-steps-by-package'; |
export * from './use-set-steps-by-package'; |
||||||
|
export * from './use-voice.hook'; |
||||||
|
@ -0,0 +1,42 @@ |
|||||||
|
import { useEffect, useState } from 'react' |
||||||
|
import Tts from 'react-native-tts' |
||||||
|
import { voiceConfig } from '../config' |
||||||
|
import { useTranslation } from 'react-i18next' |
||||||
|
|
||||||
|
export const useVoice = () => { |
||||||
|
const { i18n } = useTranslation() |
||||||
|
const [ttsStatus, setTtsStatus] = useState('initiliazing') |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
Tts.addEventListener('tts-finish', _event => setTtsStatus('finished')) |
||||||
|
Tts.addEventListener('tts-cancel', _event => setTtsStatus('cancelled')) |
||||||
|
Tts.getInitStatus().then(initTts) |
||||||
|
|
||||||
|
return () => { |
||||||
|
if (ttsStatus === 'finished') { |
||||||
|
Tts.removeEventListener('tts-start', _event => |
||||||
|
setTtsStatus('started'), |
||||||
|
) |
||||||
|
} |
||||||
|
|
||||||
|
Tts.removeEventListener('tts-finish', _event => |
||||||
|
setTtsStatus('finished'), |
||||||
|
) |
||||||
|
Tts.removeEventListener('tts-cancel', _event => |
||||||
|
setTtsStatus('cancelled'), |
||||||
|
) |
||||||
|
} |
||||||
|
}, []) |
||||||
|
|
||||||
|
const initTts = async () => { |
||||||
|
try { |
||||||
|
await Tts.setDefaultLanguage(voiceConfig[i18n.language].language) |
||||||
|
await Tts.setDefaultVoice(voiceConfig[i18n.language].voice) |
||||||
|
await Tts.setDefaultRate(0.5) |
||||||
|
} catch (err) { |
||||||
|
//Samsung S9 has always this error:
|
||||||
|
//"Language is not supported"
|
||||||
|
console.log(`setDefaultLanguage error `, err) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -1,3 +1,4 @@ |
|||||||
export * from './selected-language-in-settings.atom' |
export * from './selected-language-in-settings.atom' |
||||||
export * from './switch-notifications.atom' |
export * from './switch-notifications.atom' |
||||||
export * from './purchases.atom' |
export * from './purchases.atom' |
||||||
|
export * from './switch-voiceover.atom'; |
||||||
|
@ -0,0 +1,33 @@ |
|||||||
|
import React, { useEffect, useState } from 'react' |
||||||
|
import { Switch } from 'react-native' |
||||||
|
import { StorageKey, colors, storageService } from '../../common' |
||||||
|
|
||||||
|
export const SwitchVoiceoverAtom = () => { |
||||||
|
const [voiceover, setVoiceover] = useState(true) |
||||||
|
|
||||||
|
const toggleSwitch = async () => { |
||||||
|
setVoiceover(!voiceover) |
||||||
|
await storageService.set(StorageKey.Voiceover, !voiceover) |
||||||
|
} |
||||||
|
|
||||||
|
const getIsVoiceover = async () => { |
||||||
|
const isVoiceover = await storageService.get(StorageKey.Voiceover) |
||||||
|
|
||||||
|
setVoiceover(isVoiceover) |
||||||
|
} |
||||||
|
|
||||||
|
useEffect(() => { |
||||||
|
getIsVoiceover() |
||||||
|
}, []) |
||||||
|
|
||||||
|
return ( |
||||||
|
<Switch |
||||||
|
trackColor={{ true: colors.purple }} |
||||||
|
thumbColor={voiceover ? colors.turquoise : colors.darkPurple} |
||||||
|
ios_backgroundColor={colors.purple} |
||||||
|
onValueChange={toggleSwitch} |
||||||
|
style={{ width: 51 }} |
||||||
|
value={voiceover} |
||||||
|
/> |
||||||
|
) |
||||||
|
} |
Loading…
Reference in new issue