11import React , { useState , useContext , useEffect , useRef } from "react"
22import { Animated , PanResponder , StyleSheet } from "react-native" ;
33import { DataContext } from "../GameContext"
4- import { cardImages , blankCard , sleep } from "../Data/data"
4+ import { cardImages , blankCard , sleep , sounds } from "../Data/data"
5+ import { Audio } from "expo-av" ;
56
6- export default function Card ( { card, scale, use, position } ) {
7- const { setPlayerChoice, upTrump, appPreferences } = useContext ( DataContext )
7+ export default function Card ( { card, scale, use, position, order } ) {
8+ const { setPlayerChoice, upTrump, appPreferences, matchStage , enableSound } = useContext ( DataContext )
89 const [ isTrump , setIsTrump ] = useState ( false )
910 const cardCode = card === blankCard ? "blank" : "" + card . suit . code + card . faceValue . toLowerCase ( )
10- const [ imageURL , setImageURL ] = useState ( cardImages [ appPreferences . deckTheme ] [ cardCode ] )
11+ const [ imageURL , setImageURL ] = useState ( cardImages [ appPreferences . deckTheme ] [ card === blankCard ? "blank" : "" + card . suit . code + card . faceValue . toLowerCase ( ) ] )
1112
12- useEffect ( ( ) => {
13- setImageURL ( cardImages [ appPreferences . deckTheme ] [ cardCode ] )
14- } , [ appPreferences . deckTheme , cardCode ] )
13+ async function playCardSound ( ) {
14+ const { sound } = await Audio . Sound . createAsync (
15+ sounds . play ,
16+ { isMuted : ! enableSound , volume : .2 }
17+ )
18+ await sound . playAsync ( )
19+ }
1520
16- const moveAnim = useRef ( new Animated . ValueXY ( ) ) . current ;
21+ const moveAnim = useRef ( new Animated . ValueXY ( ) ) . current
1722 const fadeAnim = useRef ( new Animated . Value ( 1 ) ) . current
1823 const scaleAnim = useRef ( new Animated . Value ( 1 ) ) . current
24+ const dealAnim = useRef ( new Animated . Value ( 250 ) ) . current
1925
2026 const dragResponder = useRef (
2127 PanResponder . create ( {
@@ -30,6 +36,7 @@ export default function Card({ card, scale, use, position }) {
3036 onPanResponderRelease : ( ) => {
3137 if ( moveAnim . y . _value < - 150.0 ) {
3238 // PASSED THRESHOLD FOR ACTION
39+ playCardSound ( )
3340 if ( ! isTrump ) {
3441 Animated . spring ( moveAnim , { toValue : { x : moveAnim . x , y : - 350 } , useNativeDriver : true } ) . start ( ) ;
3542 Animated . timing ( fadeAnim , { toValue : 0 , duration : 500 , useNativeDriver : true } ) . start ( ) ;
@@ -44,19 +51,32 @@ export default function Card({ card, scale, use, position }) {
4451 } )
4552 ) . current ;
4653
54+ const moveUp = ( ) => {
55+ Animated . timing (
56+ dealAnim ,
57+ {
58+ toValue : 0 ,
59+ delay : ( 1 + order ) * 100 ,
60+ duration : 250 ,
61+ useNativeDriver : true
62+ }
63+ ) . start ( ) ;
64+ } ;
65+
66+
4767 let transform
4868
4969 switch ( position ) {
5070 case 0 : {
51- transform = [ { rotate : "-3deg " } , ]
71+ transform = [ { rotate : "-2deg " } , { translateX : - 206 } , { translateY : - 40 } ]
5272 break
5373 }
5474 case 1 : {
5575 transform = [ { rotate : "-8deg" } , { translateX : 34 } , { translateY : - 30 } ]
5676 break
5777 }
5878 case 2 : {
59- transform = [ { rotate : "3deg " } , { translateY : - 100 } ]
79+ transform = [ { rotate : "4deg " } , { translateY : - 100 } ]
6080 break
6181 }
6282 case 3 : {
@@ -68,13 +88,11 @@ export default function Card({ card, scale, use, position }) {
6888
6989 const styles = StyleSheet . create ( {
7090 hand : {
71- borderRadius : 20 ,
7291 marginLeft : - 81 ,
73- marginRight : - 81
92+ marginRight : - 81 ,
7493 } ,
7594 field : {
7695 transform : transform ,
77- borderRadius : 10 ,
7896 width : 194 * scale ,
7997 height : 268 * scale ,
8098 }
@@ -92,19 +110,29 @@ export default function Card({ card, scale, use, position }) {
92110
93111 const selectedStyle = use === "HAND" ? [ styles . hand , animStyles . hand ] : [ styles . field , animStyles . field ]
94112 if ( position === 0 ) {
95- selectedStyle . push ( { position : "absolute" , bottom : 50 } )
113+ selectedStyle . push ( { position : "absolute" } )
96114 }
97115
98116 useEffect ( ( ) => {
99117 if ( card === upTrump ) setIsTrump ( true )
100118 else setIsTrump ( false )
101119 } , [ upTrump ] )
102120
121+ useEffect ( ( ) => {
122+ moveUp ( )
123+ } , [ ] )
124+
125+ useEffect ( ( ) => {
126+ setImageURL ( cardImages [ appPreferences . deckTheme ] [ cardCode ] )
127+ } , [ appPreferences . deckTheme , cardCode ] )
128+
103129 return (
104- < Animated . Image
105- source = { imageURL }
106- style = { selectedStyle }
107- { ...dragResponder . panHandlers }
108- />
130+ < Animated . View style = { { transform : [ { translateY : matchStage === "DEAL" ? dealAnim : 0 } ] } } >
131+ < Animated . Image
132+ source = { imageURL }
133+ style = { selectedStyle }
134+ { ...dragResponder . panHandlers }
135+ />
136+ </ Animated . View >
109137 )
110138}
0 commit comments