synapsecns/sanguine

View on GitHub
packages/synapse-interface/slices/priceDataSlice.ts

Summary

Maintainability
A
2 hrs
Test Coverage
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'

import {
  getSynPrices,
  getAvaxPrice,
  getEthPrice,
  getMetisPrice,
  getGmxPrice,
} from '@/utils/actions/getPrices'

export interface PriceDataState {
  synPrices: {
    ethBalanceNumber: number
    ethPrice: number
    synBalanceNumber: number
    synPrice: number
  }
  ethPrice: number
  avaxPrice: number
  metisPrice: number
  gmxPrice: number
  isLoadingSynPrices: boolean
  isLoadingEthPrice: boolean
  isLoadingAvaxPrice: boolean
  isLoadingMetisPrice: boolean
  isLoadingGmxPrice: boolean
}

const initialState: PriceDataState = {
  synPrices: {
    ethBalanceNumber: null,
    ethPrice: null,
    synBalanceNumber: null,
    synPrice: null,
  },
  ethPrice: null,
  avaxPrice: null,
  metisPrice: null,
  gmxPrice: null,
  isLoadingSynPrices: false,
  isLoadingEthPrice: false,
  isLoadingAvaxPrice: false,
  isLoadingMetisPrice: false,
  isLoadingGmxPrice: false,
}

export const fetchSynPrices = createAsyncThunk(
  'priceData/fetchSynPrices',
  async () => {
    const synPrices = await getSynPrices()
    return synPrices
  }
)

export const fetchEthPrice = createAsyncThunk(
  'priceData/fetchEthPrice',
  async () => {
    const ethPrice = await getEthPrice()
    return ethPrice
  }
)

export const fetchAvaxPrice = createAsyncThunk(
  'priceData/fetchAvaxPrice',
  async () => {
    const avaxPrice = await getAvaxPrice()
    return avaxPrice
  }
)

export const fetchMetisPrice = createAsyncThunk(
  'priceData/fetchMetisPrice',
  async () => {
    const metisPrice = await getMetisPrice()
    return metisPrice
  }
)

export const fetchGmxPrice = createAsyncThunk(
  'priceData/fetchGmxPrice',
  async () => {
    const gmxPrice = await getGmxPrice()
    return gmxPrice
  }
)

export const priceDataSlice = createSlice({
  name: 'priceData',
  initialState,
  reducers: {
    resetPriceData: () => initialState,
  },
  extraReducers: (builder) => {
    builder
      .addCase(fetchSynPrices.pending, (state) => {
        state.isLoadingSynPrices = true
      })
      .addCase(fetchSynPrices.fulfilled, (state, action) => {
        state.isLoadingSynPrices = false
        state.synPrices = action.payload
      })
      .addCase(fetchSynPrices.rejected, (state) => {
        state.isLoadingSynPrices = false
        console.error('Error fetching Syn prices')
      })
      .addCase(fetchEthPrice.pending, (state) => {
        state.isLoadingEthPrice = true
      })
      .addCase(fetchEthPrice.fulfilled, (state, action) => {
        state.isLoadingEthPrice = false
        state.ethPrice = action.payload
      })
      .addCase(fetchEthPrice.rejected, (state) => {
        state.isLoadingEthPrice = false
        console.error('Error fetching Eth price')
      })
      .addCase(fetchAvaxPrice.pending, (state) => {
        state.isLoadingAvaxPrice = true
      })
      .addCase(fetchAvaxPrice.fulfilled, (state, action) => {
        state.isLoadingAvaxPrice = false
        state.avaxPrice = action.payload
      })
      .addCase(fetchAvaxPrice.rejected, (state) => {
        state.isLoadingAvaxPrice = false
        console.error('Error fetching Avax price')
      })
      .addCase(fetchMetisPrice.pending, (state) => {
        state.isLoadingMetisPrice = true
      })
      .addCase(fetchMetisPrice.fulfilled, (state, action) => {
        state.isLoadingMetisPrice = false
        state.metisPrice = action.payload
      })
      .addCase(fetchMetisPrice.rejected, (state) => {
        state.isLoadingMetisPrice = false
        console.error('Error fetching Metis price')
      })
      .addCase(fetchGmxPrice.pending, (state) => {
        state.isLoadingGmxPrice = true
      })
      .addCase(fetchGmxPrice.fulfilled, (state, action) => {
        state.isLoadingGmxPrice = false
        state.gmxPrice = action.payload
      })
      .addCase(fetchGmxPrice.rejected, (state) => {
        state.isLoadingGmxPrice = false
        console.error('Error fetching GMX price')
      })
  },
})

export const { resetPriceData } = priceDataSlice.actions

export default priceDataSlice.reducer