monitorStore.ts

import { makeAutoObservable } from "mobx";

export type MonitoringCycle = 'DAILY' | 'WEEKLY' | 'MONTHLY';

export class MonitorStore {
cycle: MonitoringCycle = 'DAILY';
startTime: string = '';
dayOfWeek: string = 'MON';
dayOfMonth: number = 1;

constructor() {

makeAutoObservable(this);

}

setCycle = (cycle: MonitoringCycle) => {

this.cycle = cycle;

};

setStartTime = (time: string) => {

this.startTime = time;

};

setDayOfWeek = (day: string) => {

this.dayOfWeek = day;

};

setDayOfMonth = (day: number) => {

this.dayOfMonth = day;

};
}

export const monitorStore = new MonitorStore();
Monitor.tsx
tsx
복사
편집
import React from 'react';
import { observer } from 'mobx-react-lite';
import { monitorStore } from './monitorStore';

export const Monitor = observer(() => {
const store = monitorStore;

const handleCycleChange = (e: React.ChangeEvent) => {

store.setCycle(e.target.value as any);

};

const handleStartTimeChange = (e: React.ChangeEvent) => {

store.setStartTime(e.target.value);

};

const handleDayOfWeekChange = (e: React.ChangeEvent) => {

store.setDayOfWeek(e.target.value);

};

const handleDayOfMonthChange = (e: React.ChangeEvent) => {

store.setDayOfMonth(Number(e.target.value));

};

const renderDayOfWeekOptions = () => {

const days = ['MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT', 'SUN'];
return (
  <div>
    <label>요일 선택: </label>
    {days.map(day => (
      <label key={day} style={{ marginRight: 10 }}>
        <input
          type="radio"
          name="dayOfWeek"
          value={day}
          checked={store.dayOfWeek === day}
          onChange={handleDayOfWeekChange}
        />
        {day}
      </label>
    ))}
  </div>
);

};

const renderDayOfMonthOptions = () => {

return (
  <div>
    <label>날짜 선택: </label>
    <select value={store.dayOfMonth} onChange={handleDayOfMonthChange}>
      {Array.from({ length: 31 }, (_, i) => i + 1).map(day => (
        <option key={day} value={day}>
          {day}일
        </option>
      ))}
    </select>
  </div>
);

};

return (

<div style={{ padding: 20, fontFamily: 'Arial' }}>
  <h3>모니터링 주기 설정</h3>

  <div style={{ marginBottom: 10 }}>
    <label>주기 선택: </label>
    {(['DAILY', 'WEEKLY', 'MONTHLY'] as const).map((type) => (
      <label key={type} style={{ marginRight: 10 }}>
        <input
          type="radio"
          name="cycle"
          value={type}
          checked={store.cycle === type}
          onChange={handleCycleChange}
        />
        {type}
      </label>
    ))}
  </div>

  <div style={{ marginBottom: 10 }}>
    <label>Start Time: </label>
    <input
      type="text"
      value={store.startTime}
      onChange={handleStartTimeChange}
      placeholder="HH:mm"
    />
  </div>

  {store.cycle === 'WEEKLY' && renderDayOfWeekOptions()}
  {store.cycle === 'MONTHLY' && renderDayOfMonthOptions()}
</div>

);
});
index.tsx
tsx
복사
편집
import React from 'react';
import ReactDOM from 'react-dom';
import { Monitor } from './Monitor';

ReactDOM.render(
<React.StrictMode>

<Monitor />

</React.StrictMode>,
document.getElementById('root')
);

tag: none

댓글추가