1. 다이어그램

sequenceDiagram
    participant 사용자
    participant 스왑시스템
    participant API

    사용자->>스왑시스템: 스왑 페이지 진입
    스왑시스템->>API: 사용자 잔액 요청
    API-->>스왑시스템: 사용자 잔액 응답
    스왑시스템->>API: 토큰 가치 조회 요청
    API-->>스왑시스템: 토큰 가치 응답
    스왑시스템-->>사용자: 잔액 및 교환 가능 금액 표시

    사용자->>스왑시스템: 지불 금액 입력
    스왑시스템-->>사용자: 받을 토큰 금액 계산 및 표시

    사용자->>스왑시스템: Swap 요청
    스왑시스템->>API: Swap POST 요청
    API-->>스왑시스템: Swap 응답
    스왑시스템-->>사용자: 잔액 갱신 및 성공 메시지 표시


2. SCSS 구조 확인

<aside> 📌

📂 style/common/

<aside> 📌

📂 style/component

<aside> 📌

📂 style/layout

<aside> 📌

📂 style/view


3. API 분석

<aside> 📌

사용자 화폐 별 금액 조회 API 1

<aside> 📌

화폐 가치 조회 API 2

</aside>

<aside> 📌

교환 요청 API 3

</aside>

<aside> 📌

api.ts

export const fetchBalance = async () => {
  const response = await fetch("<https://inhousedashboard-test-app.azurewebsites.net/api/Interview/get-balance>");
  if (!response.ok) throw new Error("Error fetching balance");
  return response.json();
};

export const fetchPrices = async () => {
  const response = await fetch("<https://inhousedashboard-test-app.azurewebsites.net/api/Interview/get-price>");
  if (!response.ok) throw new Error("Error fetching prices");
  return response.json();
};

export const postSwap = async (swapData: { fromCurrency: string; toCurrency: string; amount: number }) => {
  const response = await fetch("<https://inhousedashboard-test-app.azurewebsites.net/api/Interview/post-swap>", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify(swapData),
  });
  if (!response.ok) throw new Error("Error swapping currencies");
  return response.json();
};

</aside>


4. 상태 관리

<aside> 📌

tokenSlice.ts

// tokensSlice를 통해 전역 상태로 관리할 수 있다. 이 상태는 다른 컴포넌트에서 쉽게 접근할 수 있다.
import { createSlice } from "@reduxjs/toolkit";

// Token 인터페이스 정의: 토큰의 이름(name)과 심볼(symbol)을 포함
// name과 symbol이 동일하더라도, 이를 배열로 정의하면 각 토큰의 이름과 심볼을 쌍으로 묶어 관리하는 방식이 명확하게 보인다고 생각함.
// 나중에 코드에서 해당 토큰을 다룰 때, 이름이나 심볼을 기준으로 쉽게 접근할 수 있을것 같다.
export interface Token {
  name: string;
  symbol: string;
}

const initialState: Token[] = [
  { name: "CTC", symbol: "CTC" },
  { name: "USDC", symbol: "USDC" },
  { name: "USDT", symbol: "USDT" },
  { name: "WCTC", symbol: "WCTC" },
];

const tokensSlice = createSlice({
  name: "tokens",
  initialState,
  reducers: {},
});

export default tokensSlice.reducer;

</aside>