/ src / calculations.js
calculations.js
  1  const satsPerBtc = 100000000 // one hundred million per btc
  2  import cryptoUtils from './crypto.js'
  3  
  4  function access(active, memberBoost, charged){
  5      if (active <= 0  || charged < 0){
  6          return false
  7      }
  8      let newBalance = memberBoost - charged
  9      return newBalance >= 0
 10  }
 11  
 12  function crawlerHash(tasks, taskId){
 13      return cryptoUtils.createHash(Buffer.from(crawler(tasks, taskId)))
 14  }
 15  
 16  function crawler(tasks, taskId){
 17    let history = []
 18    tasks.forEach(task => {
 19        if(task.taskId === taskId) {
 20            let crawler = [taskId]
 21            do {
 22                let newCards = []
 23                crawler.forEach(t => {
 24                    if(history.indexOf(t) >= 0) return
 25                    history.push(t)
 26                    let subTask = tasks.filter(pst => pst.taskId === t)[0]
 27                    if (subTask){
 28                        newCards = newCards.concat(subTask.subTasks).concat(subTask.priorities).concat(subTask.completed)
 29                    }
 30                })
 31                crawler = newCards
 32            } while(crawler.length > 0)
 33        }
 34    })
 35    return history
 36  }
 37  
 38  function shortName(name) {
 39      let limit = 280
 40      let shortened = name.substring(0, limit).toLowerCase()
 41      if(name.length > limit) {
 42          shortened += '…'
 43      }
 44      return shortened
 45  }
 46  
 47  function cardColorCSS(color) {
 48      return {
 49          redwx : color == 'red',
 50          bluewx : color == 'blue',
 51          greenwx : color == 'green',
 52          yellowwx : color == 'yellow',
 53          purplewx : color == 'purple',
 54          blackwx : color == 'black',
 55      }
 56  }
 57  
 58  function blankMember(memberId, name, fob, secret, lastUsed){
 59      return {
 60        memberId,
 61        name,
 62        fob,
 63        secret,
 64        lastUsed,
 65        active: 0,
 66        muted: true,
 67        tooltips: false,
 68        stacks: 1,
 69        payments: 0,
 70        boats: false,
 71        action: false,
 72        guides:true,
 73      }
 74  }
 75  
 76  function blankCard(taskId, name, color, createdTs, deck = [], priorities = []) {
 77      let newCard = {
 78          lastUsed: createdTs,
 79          createdTs,
 80          taskId,
 81          color,
 82          deck,
 83          priorities,
 84          name: name.trim(),
 85          btcAddr: false,
 86          bolt11: false,
 87          book: {},
 88          boost: 0,
 89          subTasks: [],
 90          completed: [],
 91          claimed: [],
 92          actions: [],
 93          guild: false,
 94          lastClaimed: 0,
 95          completeValue: 0,
 96          payment_hash: '',
 97          highlights: [],
 98          claims: [],
 99          stackView: {
100              all: 0,
101              red: 0,
102              blue: 0,
103              yellow: 0,
104              green: 0,
105              purple: 0,
106              completed: false,
107          },
108          payments: [],
109      }
110      return newCard
111  }
112  
113  function safeMerge(cardA, cardZ) {
114      cardA.subTasks = [...new Set(cardA.subTasks.concat(cardZ.subTasks))]
115      cardA.priorities = [...new Set(cardA.priorities.concat(cardZ.priorities))]
116      cardA.completed = [...new Set(cardA.completed.concat(cardZ.completed))]
117      cardA.guild = cardZ.guild
118      // XXX only add in merge for now
119      // XXX bolt11 / address need to clearly indicate origin ao
120      // XXX book should be a list?
121  }
122  
123  function cadToSats(cadAmt, spot){
124      let sats = parseFloat( cadAmt ) / parseFloat( spot ) * satsPerBtc
125      return parseInt(sats)
126  }
127  
128  function satsToCad(sats, spot){
129      let cad = sats * (spot / satsPerBtc)
130      return cad.toFixed(2)
131  }
132  
133  function calculateMsThisMonth(){
134      let today = new Date()
135      let daysThisMonth = new Date(today.getYear(), today.getMonth(), 0).getDate()
136      return daysThisMonth * 24 * 60 * 60 * 1000
137  }
138  
139  function getMeridienTime(ts){
140  
141      let d = new Date( parseInt(ts) )
142      let hour24 = d.getHours()
143  
144      let rollover = 0
145      if (hour24 >= 24){
146          rollover = 1
147          hour24 %= 24
148      }
149  
150      let hour, meridien
151      if (hour24 > 12){
152          meridien = 'pm'
153          hour = hour24 - 12
154      } else {
155          meridien = 'am'
156          hour = hour24
157      }
158  
159      let date = d.getDate() + rollover
160      let month = d.getMonth() + 1
161      let minute = d.getMinutes()
162      let year = d.getFullYear()
163  
164      let weekday = d.toString().slice(0,3)
165  
166      return { weekday, year, month, date, hour, minute, meridien }
167  }
168  
169  export default {
170    cadToSats,
171    satsToCad,
172    getMeridienTime,
173    shortName,
174    cardColorCSS,
175    blankCard,
176    blankMember,
177    // safeClone,
178    safeMerge,
179    crawler,
180    crawlerHash,
181    access,
182    calculateMsThisMonth,
183  }