about summary refs log blame commit diff
path: root/website/days-of-week-habits/src/store.ts
blob: 2bcb802580e62fec1603cdf83e7c0a0e2a036838 (plain) (tree)






















































































































































                                                                                
import { createSlice, configureStore, PayloadAction } from "@reduxjs/toolkit";
import { useSelector, TypedUseSelectorHook } from "react-redux";

// Monday    0
// Tuesday   1
// Wednesday 2
// Thursday  3
// Friday    4
// Saturday  5
// Sunday    6
type Day = number;

export interface Task {
  label: string;
  // Number of milliseconds
  duration: number;
}

export interface Habit {
  day: Day;
  tasks: Task[];
}

export interface State {
  isLoading: boolean;
  habits: Habit[];
}

const minute: number = 1000 * 60;
const hour: number = minute * 60;

/*******************************************************************************
 * Tasks
 ******************************************************************************/

const jiuJitsu: Task = {
  label: "Jiu Jitsu",
  duration: hour,
};

const hotYoga: Task = {
  label: "Hot Pod Yoga",
  duration: hour,
};

const shave: Task = {
  label: "Shave",
  duration: 10 * minute,
};

const vacuum: Task = {
  label: "Vacuum",
  duration: 15 * minute,
};

const nap: Task = {
  label: "Nap",
  duration: hour,
};

const trimNails: Task = {
  label: "Trim Nails",
  duration: 5 * minute,
};

const trash: Task = {
  label: "Take out trash",
  duration: 5 * minute,
};

const scheduleLaundry: Task = {
  label: "Schedule laundry pick-up",
  duration: 5 * minute,
};

/*******************************************************************************
 * Days
 ******************************************************************************/

const monday: Habit = {
  day: 0,
  tasks: [jiuJitsu],
};

const tuesday: Habit = {
  day: 1,
  tasks: [
    {
      label: "Work from 6PS",
      duration: hour * 8,
    },
    jiuJitsu,
  ],
};

const wednesday: Habit = {
  day: 2,
  tasks: [
    hotYoga,
    shave,
    {
      label: "Clean apartment sinks",
      duration: 15 * minute,
    },
  ],
};

const thursday: Habit = {
  day: 3,
  tasks: [],
};

const friday: Habit = {
  day: 4,
  tasks: [hotYoga],
};

const saturday: Habit = {
  day: 5,
  tasks: [vacuum, nap],
};

const sunday: Habit = {
  day: 6,
  tasks: [jiuJitsu, nap, shave, trimNails, trash, scheduleLaundry],
};

/*******************************************************************************
 * State
 ******************************************************************************/

const initialState: State = {
  isLoading: true,
  habits: [monday, tuesday, wednesday, thursday, friday, saturday, sunday],
};

export const { actions, reducer } = createSlice({
  name: "application",
  initialState,
  reducers: {
    toggleIsLoading: (state) => ({ ...state, isLoading: !state.isLoading }),
  },
});

/**
 * Defining and consuming this allows us to avoid annotating State in all of our
 * selectors.
 */
export const useTypedSelector: TypedUseSelectorHook<State> = useSelector;

export default configureStore({ reducer });