Grabbed dndbeyond's source code
``` ~/go/bin/sourcemapper -output ddb -jsurl https://media.dndbeyond.com/character-app/static/js/main.90aa78c5.js ```
This commit is contained in:
@@ -0,0 +1,451 @@
|
||||
import { takeEvery, call, put, select } from "redux-saga/effects";
|
||||
|
||||
import {
|
||||
ApiRequests,
|
||||
SagaHelpers,
|
||||
UnpackMakeApiResponseData,
|
||||
DiceRolls,
|
||||
RollGroupContract,
|
||||
HelperUtils,
|
||||
} from "@dndbeyond/character-rules-engine/es";
|
||||
|
||||
import { rollResultActions, rollResultActionTypes } from "../actions";
|
||||
import {
|
||||
RollResultAction,
|
||||
RollResultComponentGroupPersistAction,
|
||||
RollResultComponentSimulatedGroupsPersistAction,
|
||||
RollResultDiceRollSetAction,
|
||||
RollResultGroupAddAction,
|
||||
RollResultGroupCreateAction,
|
||||
RollResultGroupDestroyAction,
|
||||
RollResultGroupOrderSetAction,
|
||||
RollResultGroupRemoveAction,
|
||||
RollResultGroupResetAction,
|
||||
RollResultGroupsLoadAction,
|
||||
RollResultComponentPersistAction,
|
||||
} from "../actions/rollResult/typings";
|
||||
import { appSelectors, rollResultSelectors } from "../selectors";
|
||||
import { RollResultUtils } from "../utils";
|
||||
|
||||
export default function* saga() {
|
||||
yield takeEvery(
|
||||
Object.keys(rollResultActionTypes).map((key) => rollResultActionTypes[key]),
|
||||
filter
|
||||
);
|
||||
}
|
||||
|
||||
function* filter(action: RollResultAction) {
|
||||
switch (action.type) {
|
||||
case rollResultActionTypes.ROLL_RESULT_GROUPS_LOAD:
|
||||
yield call(handleRollResultGroupsLoad, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_GROUP_CREATE:
|
||||
yield call(handleRollResultGroupCreate, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_GROUP_ADD:
|
||||
yield call(handleRollResultGroupAdd, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_GROUP_DESTROY:
|
||||
yield call(handleRollResultGroupDestroy, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_GROUP_REMOVE:
|
||||
yield call(handleRollResultGroupRemove, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_DICE_ROLL_SET:
|
||||
yield call(handleRollResultDiceRollSet, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_GROUP_ORDER_SET:
|
||||
yield call(handleRollResultGroupOrderSet, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_GROUP_RESET:
|
||||
yield call(handleRollResultGroupReset, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_COMPONENT_GROUP_PERSIST:
|
||||
yield call(handleRollResultPersistGroup, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_COMPONENT_PERSIST:
|
||||
yield call(handleRollResultPersist, action);
|
||||
break;
|
||||
|
||||
case rollResultActionTypes.ROLL_RESULT_COMPONENT_SIMULATED_GROUPS_PERSIST:
|
||||
yield call(handleRollResultPersistSimulatedGroups, action);
|
||||
break;
|
||||
|
||||
default:
|
||||
//not implemented
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultGroupsLoad(action: RollResultGroupsLoadAction) {
|
||||
const { componentKey, simulatedGroupCount, simulatedRollResultCount } =
|
||||
action.payload;
|
||||
|
||||
const responseData: UnpackMakeApiResponseData<
|
||||
typeof ApiRequests.getCharacterRollResultGroups
|
||||
> = yield call(
|
||||
SagaHelpers.getApiRequestData,
|
||||
ApiRequests.getCharacterRollResultGroups,
|
||||
{ params: { componentKey } }
|
||||
);
|
||||
|
||||
if (responseData === null || responseData.length === 0) {
|
||||
if (simulatedGroupCount) {
|
||||
let groups: Array<RollGroupContract> = [];
|
||||
|
||||
let lastGroup: RollGroupContract | null = null;
|
||||
for (let i = 0; i < simulatedGroupCount; i++) {
|
||||
const rollGroupContract = DiceRolls.simulateRollGroupContract(
|
||||
{
|
||||
componentKey,
|
||||
nextGroupKey: lastGroup?.nextGroupKey ?? null,
|
||||
},
|
||||
simulatedRollResultCount
|
||||
);
|
||||
groups.push(rollGroupContract);
|
||||
|
||||
lastGroup = rollGroupContract;
|
||||
}
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentSimulatedGroupsSet(
|
||||
componentKey,
|
||||
groups
|
||||
)
|
||||
);
|
||||
}
|
||||
} else {
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentGroupsSetCommit(
|
||||
componentKey,
|
||||
responseData
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultGroupCreate(action: RollResultGroupCreateAction) {
|
||||
const { componentKey, simulatedRollResultCount } = action.payload;
|
||||
|
||||
const simulatedGroupsLookup: ReturnType<
|
||||
typeof rollResultSelectors.getRollResultComponentSimulatedGroupsLookup
|
||||
> = yield select(
|
||||
rollResultSelectors.getRollResultComponentSimulatedGroupsLookup
|
||||
);
|
||||
const currentSimulatedGroups = RollResultUtils.getComponentOrderedGroups(
|
||||
componentKey,
|
||||
simulatedGroupsLookup
|
||||
);
|
||||
|
||||
if (currentSimulatedGroups.length) {
|
||||
const newGroup = DiceRolls.simulateRollGroupContract(
|
||||
{
|
||||
componentKey,
|
||||
nextGroupKey: currentSimulatedGroups[0].groupKey ?? null,
|
||||
},
|
||||
simulatedRollResultCount
|
||||
);
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentSimulatedGroupsSet(componentKey, [
|
||||
newGroup,
|
||||
...currentSimulatedGroups,
|
||||
])
|
||||
);
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentSimulatedGroupsPersist(componentKey)
|
||||
);
|
||||
} else {
|
||||
const currentGroupLookup: ReturnType<
|
||||
typeof rollResultSelectors.getRollResultComponentGroupsLookup
|
||||
> = yield select(rollResultSelectors.getRollResultComponentGroupsLookup);
|
||||
const currentGroups = RollResultUtils.getComponentOrderedGroups(
|
||||
componentKey,
|
||||
currentGroupLookup
|
||||
);
|
||||
|
||||
const newGroup = DiceRolls.simulateRollGroupContract(
|
||||
{
|
||||
componentKey,
|
||||
nextGroupKey: currentGroups[0]?.groupKey ?? null,
|
||||
},
|
||||
simulatedRollResultCount
|
||||
);
|
||||
|
||||
yield put(rollResultActions.rollResultGroupAdd(newGroup));
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultGroupAdd(action: RollResultGroupAddAction) {
|
||||
const { componentKey, group } = action.payload;
|
||||
|
||||
const responseData: UnpackMakeApiResponseData<
|
||||
typeof ApiRequests.postCharacterRollResultGroup
|
||||
> = yield call(
|
||||
SagaHelpers.getApiRequestData,
|
||||
ApiRequests.postCharacterRollResultGroup,
|
||||
group
|
||||
);
|
||||
|
||||
if (responseData !== null) {
|
||||
yield put(rollResultActions.rollResultGroupAddCommit(group));
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultGroupDestroy(action: RollResultGroupDestroyAction) {
|
||||
const { groupKey, nextGroupKey, componentKey } = action.payload;
|
||||
|
||||
const currentGroupLookup = yield select(
|
||||
rollResultSelectors.getRollResultComponentGroupsLookup
|
||||
);
|
||||
const currentGroups = RollResultUtils.getGroupsByComponentKey(
|
||||
componentKey,
|
||||
currentGroupLookup
|
||||
);
|
||||
const groupToUpdate = currentGroups.find(
|
||||
(group) => group.nextGroupKey === groupKey
|
||||
);
|
||||
|
||||
yield put(rollResultActions.rollResultGroupRemove(componentKey, groupKey));
|
||||
|
||||
if (groupToUpdate) {
|
||||
yield put(
|
||||
rollResultActions.rollResultGroupOrderSet(
|
||||
componentKey,
|
||||
groupToUpdate.groupKey,
|
||||
nextGroupKey
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultGroupOrderSet(action: RollResultGroupOrderSetAction) {
|
||||
const { componentKey, groupKey, nextGroupKey } = action.payload;
|
||||
|
||||
const responseData: UnpackMakeApiResponseData<
|
||||
typeof ApiRequests.putCharacterRollResultGroupOrder
|
||||
> = yield call(
|
||||
SagaHelpers.getApiRequestData,
|
||||
ApiRequests.putCharacterRollResultGroupOrder,
|
||||
{
|
||||
groupKey,
|
||||
componentKey,
|
||||
nextGroupKey,
|
||||
}
|
||||
);
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultGroupOrderSetCommit(
|
||||
componentKey,
|
||||
groupKey,
|
||||
nextGroupKey
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function* handleRollResultGroupRemove(action: RollResultGroupRemoveAction) {
|
||||
const { componentKey, groupKey } = action.payload;
|
||||
|
||||
const responseData: UnpackMakeApiResponseData<
|
||||
typeof ApiRequests.deleteCharacterRollResultGroup
|
||||
> = yield call(
|
||||
SagaHelpers.getApiRequestData,
|
||||
ApiRequests.deleteCharacterRollResultGroup,
|
||||
{
|
||||
groupKey,
|
||||
componentKey,
|
||||
}
|
||||
);
|
||||
yield put(
|
||||
rollResultActions.rollResultGroupRemoveCommit(componentKey, groupKey)
|
||||
);
|
||||
}
|
||||
|
||||
function* handleRollResultPersistSimulatedGroups(
|
||||
action: RollResultComponentSimulatedGroupsPersistAction
|
||||
) {
|
||||
const { componentKey, groupKey, rollKey, properties } = action.payload;
|
||||
|
||||
const simulatedGroupsLookup: ReturnType<
|
||||
typeof rollResultSelectors.getRollResultComponentSimulatedGroupsLookup
|
||||
> = yield select(
|
||||
rollResultSelectors.getRollResultComponentSimulatedGroupsLookup
|
||||
);
|
||||
const currentSimulatedGroups = RollResultUtils.getGroupsByComponentKey(
|
||||
componentKey,
|
||||
simulatedGroupsLookup
|
||||
);
|
||||
|
||||
if (currentSimulatedGroups.length) {
|
||||
for (let i = 0; i < currentSimulatedGroups.length; i++) {
|
||||
const group = currentSimulatedGroups[i];
|
||||
if (rollKey && groupKey === group.groupKey) {
|
||||
// If an initial roll is with the simulated group
|
||||
const rollIndex = group.rollResults.findIndex(
|
||||
(rollResult) => rollResult.rollKey === rollKey
|
||||
);
|
||||
group.rollResults.splice(rollIndex, 1, {
|
||||
...group.rollResults[rollIndex],
|
||||
...properties,
|
||||
});
|
||||
}
|
||||
|
||||
yield put(rollResultActions.rollResultGroupAdd(group));
|
||||
}
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentSimulatedGroupsSet(componentKey, [])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultPersistGroup(
|
||||
action: RollResultComponentGroupPersistAction
|
||||
) {
|
||||
const { componentKey, groupKey, rollResults } = action.payload;
|
||||
|
||||
const currentGroupLookup = yield select(
|
||||
rollResultSelectors.getRollResultComponentGroupsLookup
|
||||
);
|
||||
const currentGroups = RollResultUtils.getGroupsByComponentKey(
|
||||
componentKey,
|
||||
currentGroupLookup
|
||||
);
|
||||
const groupToUpdate = currentGroups.find(
|
||||
(group) => group.groupKey === groupKey
|
||||
);
|
||||
|
||||
if (groupToUpdate) {
|
||||
const responseData: UnpackMakeApiResponseData<
|
||||
typeof ApiRequests.putCharacterRollResultGroup
|
||||
> = yield call(
|
||||
SagaHelpers.getApiRequestData,
|
||||
ApiRequests.putCharacterRollResultGroup,
|
||||
{
|
||||
groupKey,
|
||||
componentKey,
|
||||
rollResults,
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultPersist(action: RollResultComponentPersistAction) {
|
||||
const {
|
||||
componentKey,
|
||||
groupKey,
|
||||
rollKey,
|
||||
properties: { rollTotal, rollValues, assignedValue },
|
||||
nextRollKey,
|
||||
} = action.payload;
|
||||
|
||||
if (groupKey && rollKey) {
|
||||
const responseData: UnpackMakeApiResponseData<
|
||||
typeof ApiRequests.putCharacterRollResult
|
||||
> = yield call(
|
||||
SagaHelpers.getApiRequestData,
|
||||
ApiRequests.putCharacterRollResult,
|
||||
{
|
||||
rollKey,
|
||||
nextRollKey,
|
||||
rollTotal,
|
||||
assignedValue,
|
||||
rollValues,
|
||||
groupKey,
|
||||
componentKey,
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultDiceRollSet(action: RollResultDiceRollSetAction) {
|
||||
const { rollKey, properties, nextRollKey } = action.payload;
|
||||
|
||||
const parentKeyInfoLookup: ReturnType<
|
||||
typeof appSelectors.getRollParentKeyInfoLookup
|
||||
> = yield select(appSelectors.getRollParentKeyInfoLookup);
|
||||
const simulatedParentKeyInfoLookup: ReturnType<
|
||||
typeof appSelectors.getSimulatedRollParentKeyInfoLookup
|
||||
> = yield select(appSelectors.getSimulatedRollParentKeyInfoLookup);
|
||||
const parentKeyInfo = HelperUtils.lookupDataOrFallback(
|
||||
parentKeyInfoLookup,
|
||||
rollKey
|
||||
);
|
||||
const simulatedParentKeyInfo = HelperUtils.lookupDataOrFallback(
|
||||
simulatedParentKeyInfoLookup,
|
||||
rollKey
|
||||
);
|
||||
|
||||
if (parentKeyInfo) {
|
||||
const { groupKey, componentKey } = parentKeyInfo;
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentPersist(
|
||||
componentKey,
|
||||
groupKey,
|
||||
rollKey,
|
||||
properties,
|
||||
nextRollKey
|
||||
)
|
||||
);
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultDiceRollSetCommit(
|
||||
componentKey,
|
||||
groupKey,
|
||||
rollKey,
|
||||
properties,
|
||||
nextRollKey
|
||||
)
|
||||
);
|
||||
} else if (simulatedParentKeyInfo) {
|
||||
const { groupKey, componentKey } = simulatedParentKeyInfo;
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentSimulatedGroupsPersist(
|
||||
componentKey,
|
||||
groupKey,
|
||||
rollKey,
|
||||
properties
|
||||
)
|
||||
);
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentSimulatedDiceRollSet(
|
||||
componentKey,
|
||||
groupKey,
|
||||
rollKey,
|
||||
properties
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
function* handleRollResultGroupReset(action: RollResultGroupResetAction) {
|
||||
const { componentKey, groupKey, rollResults } = action.payload;
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultComponentGroupPersist(
|
||||
componentKey,
|
||||
groupKey,
|
||||
rollResults
|
||||
)
|
||||
);
|
||||
|
||||
yield put(
|
||||
rollResultActions.rollResultGroupResetCommit(
|
||||
componentKey,
|
||||
groupKey,
|
||||
rollResults
|
||||
)
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user