์ด์ˆœ๋ช…

๐Ÿšฌ ์ „๋‹ดGATE ๋ฌด์ธ24

โ† ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ ๋””๋ฒจ๋กœํผ๊ทธ๋ฃน ๊ฒฝ๋ ฅ๊ธฐ์ˆ ์„œ


๐Ÿ“‹ ํ”„๋กœ์ ํŠธ ๊ฐœ์š”

ย  ย 
ํ”„๋กœ์ ํŠธ ์„ค๋ช… ์ „์ž๋‹ด๋ฐฐ ํ‚ค์˜ค์Šคํฌ์™€ ์ƒํ’ˆ ๋ฐฐ์ถœ์ด ๋˜๋Š” ์žํŒ๊ธฐ ํ”„๋กœ๊ทธ๋žจ
๊ธฐ์ˆ  ์Šคํƒ Next.js, TypeScript, Koa, SCSS
์ฐธ์—ฌ๋„ ํ”„๋ก ํŠธ์—”๋“œ 100%
๊ธฐ๊ฐ„ 2023.07 ~ 2023.10


โญ ์ฃผ์š” ๊ธฐ๋Šฅ

๐ŸŽฐ ํ™•๋ฅ ์„ฑ ์ƒํ’ˆ ์‹œ์Šคํ…œ

โŒจ๏ธ ๊ฐ€์ƒ ํ‚ค๋ณด๋“œ

๐Ÿ“ก ์‹ค์‹œ๊ฐ„ ๋ฌผํ’ˆ ๊ด€๋ฆฌ

๐Ÿ” ์„ฑ์ธ์ธ์ฆ ์‹œ์Šคํ…œ (3์ข…)

1. ๋ชจ๋ฐ”์ผ ์‹ ๋ถ„์ฆ

2. ์‹ ๋ถ„์ฆ ์Šค์บ๋„ˆ

3. KCP ๋ณธ์ธ์ธ์ฆ


๐Ÿ›  ๊ธฐ์ˆ ์  ๊ตฌํ˜„

react-transition-group ์• ๋‹ˆ๋ฉ”์ด์…˜

const stepNode: { [key: string]: ReactNode } = {
  "LOGIN": <๋กœ๊ทธ์ธ />,
  "JOIN": <ํšŒ์›๊ฐ€์ž… />,
  "COMPLETE": <์™„๋ฃŒ />,
};

return (
  <SwitchTransition mode="out-in">
    <CSSTransition timeout={200} classNames="slide" key={step}>
      {stepNode[step]}
    </CSSTransition>
  </SwitchTransition>
);

zustand ์ƒํƒœ๊ด€๋ฆฌ

export const kioskSet = create<KioskSetType>()(
  devtools((set) => ({
    info: { no: 0, info: null },
    setInfo: async ({ no }) => {
      const results = await Promise.allSettled([
        axios.get("/info", { no, mode: "info" })
      ]);
      // ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋กœ์ง
    }
  }))
);

์‚ฌ์šด๋“œ Hook

export const useAudio: AudioTypes = () => {
  const [audioSource, setAudioSource] = useState<AudioObject[]>();
  
  const playAudio: PlayAudioType = useCallback((type) => {
    const audioToPlay = audioSource?.find(source => source.type === type);
    if (audioToPlay?.audio.paused) {
      audioToPlay.audio.play();
    }
  }, [audioSource]);

  return [playing, playAudio];
};


๐Ÿ”ง ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๋ชจ๋‹ฌ ๋‚ด ๊ฒฐ์ œ ๋กœ์ง ๋ณต์žก๋„

1+1 ์ œํ’ˆ ์ด์Šˆ


๐Ÿ’ก ์„ฑ๊ณผ



โ† ๋ฉ”์ธ์œผ๋กœ ๋Œ์•„๊ฐ€๊ธฐ