fix custom dates to use ms since epoch

This commit is contained in:
keyan 2023-11-14 10:23:44 -06:00
parent ffe9983b80
commit 589b15b597
11 changed files with 47 additions and 55 deletions

View File

@ -1,5 +1,4 @@
import { timeUnitForRange } from '../../lib/time' import { timeUnitForRange, whenRange } from '../../lib/time'
import { whenRange } from './item'
const PLACEHOLDERS_NUM = 616 const PLACEHOLDERS_NUM = 616

View File

@ -18,7 +18,7 @@ import { advSchema, amountSchema, bountySchema, commentSchema, discussionSchema,
import { sendUserNotification } from '../webPush' import { sendUserNotification } from '../webPush'
import { defaultCommentSort, isJob, deleteItemByAuthor, getDeleteCommand, hasDeleteCommand } from '../../lib/item' import { defaultCommentSort, isJob, deleteItemByAuthor, getDeleteCommand, hasDeleteCommand } from '../../lib/item'
import { notifyItemParents, notifyUserSubscribers, notifyZapped } from '../../lib/push-notifications' import { notifyItemParents, notifyUserSubscribers, notifyZapped } from '../../lib/push-notifications'
import { datePivot, dayMonthYearToDate, whenToFrom } from '../../lib/time' import { datePivot, whenRange } from '../../lib/time'
import { imageFeesInfo, uploadIdsFromText } from './image' import { imageFeesInfo, uploadIdsFromText } from './image'
export async function commentFilterClause (me, models) { export async function commentFilterClause (me, models) {
@ -199,15 +199,6 @@ function whenClause (when, table) {
return `"${table}".created_at <= $2 and "${table}".created_at >= $1` return `"${table}".created_at <= $2 and "${table}".created_at >= $1`
} }
export function whenRange (when, from, to = new Date()) {
switch (when) {
case 'custom':
return [dayMonthYearToDate(from), dayMonthYearToDate(to)]
default:
return [dayMonthYearToDate(whenToFrom(when)), new Date(to)]
}
}
const activeOrMine = (me) => { const activeOrMine = (me) => {
return me ? `("Item".status <> 'STOPPED' OR "Item"."userId" = ${me.id})` : '"Item".status <> \'STOPPED\'' return me ? `("Item".status <> 'STOPPED' OR "Item"."userId" = ${me.id})` : '"Item".status <> \'STOPPED\''
} }

View File

@ -1,7 +1,6 @@
import { GraphQLError } from 'graphql' import { GraphQLError } from 'graphql'
import { withClause, intervalClause } from './growth' import { withClause, intervalClause } from './growth'
import { whenRange } from './item' import { timeUnitForRange, whenRange } from '../../lib/time'
import { timeUnitForRange } from '../../lib/time'
export default { export default {
Query: { Query: {

View File

@ -4,9 +4,10 @@ import { GraphQLError } from 'graphql'
import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor' import { decodeCursor, LIMIT, nextCursorEncoded } from '../../lib/cursor'
import { msatsToSats } from '../../lib/format' import { msatsToSats } from '../../lib/format'
import { bioSchema, emailSchema, settingsSchema, ssValidate, userSchema } from '../../lib/validate' import { bioSchema, emailSchema, settingsSchema, ssValidate, userSchema } from '../../lib/validate'
import { getItem, updateItem, filterClause, createItem, whereClause, muteClause, whenRange } from './item' import { getItem, updateItem, filterClause, createItem, whereClause, muteClause } from './item'
import { ANON_USER_ID, DELETE_USER_ID, RESERVED_MAX_USER_ID } from '../../lib/constants' import { ANON_USER_ID, DELETE_USER_ID, RESERVED_MAX_USER_ID } from '../../lib/constants'
import { viewIntervalClause, intervalClause } from './growth' import { viewIntervalClause, intervalClause } from './growth'
import { whenRange } from '../../lib/time'
const contributors = new Set() const contributors = new Set()

View File

@ -26,7 +26,7 @@ import 'react-datepicker/dist/react-datepicker.css'
import useDebounceCallback, { debounce } from './use-debounce-callback' import useDebounceCallback, { debounce } from './use-debounce-callback'
import { ImageUpload } from './image' import { ImageUpload } from './image'
import { AWS_S3_URL_REGEXP } from '../lib/constants' import { AWS_S3_URL_REGEXP } from '../lib/constants'
import { dayMonthYear, dayMonthYearToDate, whenToFrom } from '../lib/time' import { whenRange } from '../lib/time'
import { useFeeButton } from './fee-button' import { useFeeButton } from './fee-button'
import Thumb from '../svgs/thumb-up-fill.svg' import Thumb from '../svgs/thumb-up-fill.svg'
@ -845,18 +845,13 @@ export function DatePicker ({ fromName, toName, noForm, onChange, when, from, to
const [,, toHelpers] = noForm ? [{}, {}, {}] : useField({ ...props, name: toName }) const [,, toHelpers] = noForm ? [{}, {}, {}] : useField({ ...props, name: toName })
const { minDate, maxDate } = props const { minDate, maxDate } = props
const [{ innerFrom, innerTo }, setRange] = useState({ const [[innerFrom, innerTo], setRange] = useState(whenRange(when, from, to))
innerFrom: from || whenToFrom(when),
innerTo: to || dayMonthYear(new Date())
})
useEffect(() => { useEffect(() => {
const tfrom = from || whenToFrom(when) setRange(whenRange(when, from, to))
const tto = to || dayMonthYear(new Date())
setRange({ innerFrom: tfrom, innerTo: tto })
if (!noForm) { if (!noForm) {
fromHelpers.setValue(tfrom) fromHelpers.setValue(new Date(to))
toHelpers.setValue(tto) toHelpers.setValue(new Date(to))
} }
}, [when, from, to]) }, [when, from, to])
@ -870,9 +865,7 @@ export function DatePicker ({ fromName, toName, noForm, onChange, when, from, to
}, []) }, [])
const innerOnChange = ([from, to], e) => { const innerOnChange = ([from, to], e) => {
from = dayMonthYear(from) setRange(whenRange(when, from, to))
to = to ? dayMonthYear(to) : undefined
setRange({ innerFrom: from, innerTo: to })
if (!noForm) { if (!noForm) {
fromHelpers.setValue(from) fromHelpers.setValue(from)
toHelpers.setValue(to) toHelpers.setValue(to)
@ -887,9 +880,9 @@ export function DatePicker ({ fromName, toName, noForm, onChange, when, from, to
const dates = dateStrings.map(s => new Date(s)) const dates = dateStrings.map(s => new Date(s))
let [from, to] = dates let [from, to] = dates
if (from) { if (from) {
if (minDate) from = new Date(Math.max(from, minDate)) if (minDate) from = new Date(Math.max(from.getTime(), minDate.getTime()))
try { try {
if (maxDate) to = new Date(Math.min(to, maxDate)) if (maxDate) to = new Date(Math.min(to.getTime(), maxDate.getTime()))
// if end date isn't valid, set it to the start date // if end date isn't valid, set it to the start date
if (!(to instanceof Date && !isNaN(to)) || to < from) to = from if (!(to instanceof Date && !isNaN(to)) || to < from) to = from
@ -908,9 +901,9 @@ export function DatePicker ({ fromName, toName, noForm, onChange, when, from, to
maxDate={new Date()} maxDate={new Date()}
minDate={new Date('2021-05-01')} minDate={new Date('2021-05-01')}
{...props} {...props}
selected={dayMonthYearToDate(innerFrom)} selected={new Date(innerFrom)}
startDate={dayMonthYearToDate(innerFrom)} startDate={new Date(innerFrom)}
endDate={innerTo ? dayMonthYearToDate(innerTo) : undefined} endDate={innerTo ? new Date(innerTo) : undefined}
dateFormat={dateFormat} dateFormat={dateFormat}
onChangeRaw={onChangeRawHandler} onChangeRaw={onChangeRawHandler}
onChange={innerOnChange} onChange={innerOnChange}

View File

@ -4,7 +4,7 @@ import SearchIcon from '../svgs/search-line.svg'
import { useEffect, useRef, useState } from 'react' import { useEffect, useRef, useState } from 'react'
import { Form, Input, Select, DatePicker, SubmitButton } from './form' import { Form, Input, Select, DatePicker, SubmitButton } from './form'
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import { dayMonthYear, whenToFrom } from '../lib/time' import { whenToFrom } from '../lib/time'
export default function Search ({ sub }) { export default function Search ({ sub }) {
const router = useRouter() const router = useRouter()
@ -103,7 +103,7 @@ export default function Search ({ sub }) {
<Select <Select
groupClassName='mb-0 mx-2' groupClassName='mb-0 mx-2'
onChange={(formik, e) => { onChange={(formik, e) => {
const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: dayMonthYear(new Date()) } : {} const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: Date.now() } : {}
search({ ...formik?.values, when: e.target.value, ...range }) search({ ...formik?.values, when: e.target.value, ...range })
}} }}
name='when' name='when'
@ -119,7 +119,7 @@ export default function Search ({ sub }) {
toName='to' toName='to'
className='p-0 px-2 mb-2' className='p-0 px-2 mb-2'
onChange={(formik, [from, to], e) => { onChange={(formik, [from, to], e) => {
search({ ...formik?.values, from, to }) search({ ...formik?.values, from: from.getTime(), to: to.getTime() })
}} }}
from={router.query.from} from={router.query.from}
to={router.query.to} to={router.query.to}

View File

@ -1,7 +1,7 @@
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import { Form, Select, DatePicker } from './form' import { Form, Select, DatePicker } from './form'
import { ITEM_SORTS, USER_SORTS, WHENS } from '../lib/constants' import { ITEM_SORTS, USER_SORTS, WHENS } from '../lib/constants'
import { dayMonthYear, whenToFrom } from '../lib/time' import { whenToFrom } from '../lib/time'
export default function TopHeader ({ sub, cat }) { export default function TopHeader ({ sub, cat }) {
const router = useRouter() const router = useRouter()
@ -71,7 +71,7 @@ export default function TopHeader ({ sub, cat }) {
<Select <Select
groupClassName='mb-0 mx-2' groupClassName='mb-0 mx-2'
onChange={(formik, e) => { onChange={(formik, e) => {
const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: dayMonthYear(new Date()) } : {} const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: Date.now() } : {}
top({ ...formik?.values, when: e.target.value, ...range }) top({ ...formik?.values, when: e.target.value, ...range })
}} }}
name='when' name='when'
@ -88,7 +88,7 @@ export default function TopHeader ({ sub, cat }) {
toName='to' toName='to'
className='p-0 px-2 my-2' className='p-0 px-2 my-2'
onChange={(formik, [from, to], e) => { onChange={(formik, [from, to], e) => {
top({ ...formik?.values, from, to }) top({ ...formik?.values, from: from.getTime(), to: to.getTime() })
}} }}
from={router.query.from} from={router.query.from}
to={router.query.to} to={router.query.to}

View File

@ -1,7 +1,7 @@
import { useRouter } from 'next/router' import { useRouter } from 'next/router'
import { Select, DatePicker } from './form' import { Select, DatePicker } from './form'
import { WHENS } from '../lib/constants' import { WHENS } from '../lib/constants'
import { dayMonthYear, whenToFrom } from '../lib/time' import { whenToFrom } from '../lib/time'
export function UsageHeader () { export function UsageHeader () {
const router = useRouter() const router = useRouter()
@ -33,7 +33,7 @@ export function UsageHeader () {
value={when} value={when}
noForm noForm
onChange={(formik, e) => { onChange={(formik, e) => {
const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: dayMonthYear(new Date()) } : {} const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: Date.now() } : {}
select({ when: e.target.value, ...range }) select({ when: e.target.value, ...range })
}} }}
/> />
@ -45,7 +45,7 @@ export function UsageHeader () {
toName='to' toName='to'
className='p-0 px-2 mb-0' className='p-0 px-2 mb-0'
onChange={(formik, [from, to], e) => { onChange={(formik, [from, to], e) => {
select({ when, from, to }) select({ when, from: from.getTime(), to: to.getTime() })
}} }}
from={router.query.from} from={router.query.from}
to={router.query.to} to={router.query.to}

View File

@ -61,9 +61,18 @@ export function timeLeft (timeStamp) {
} }
} }
export function whenRange (when, from, to = Date.now()) {
switch (when) {
case 'custom':
return [new Date(Number(from)), new Date(Number(to))]
default:
return [new Date(whenToFrom(when)), new Date(Number(to))]
}
}
export function timeUnitForRange ([from, to]) { export function timeUnitForRange ([from, to]) {
const date1 = new Date(from) const date1 = new Date(Number(from))
const date2 = new Date(to) const date2 = new Date(Number(to))
const diffTime = Math.abs(date2 - date1) const diffTime = Math.abs(date2 - date1)
const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24))
@ -85,15 +94,15 @@ export function timeUnitForRange ([from, to]) {
export const whenToFrom = (when) => { export const whenToFrom = (when) => {
switch (when) { switch (when) {
case 'day': case 'day':
return dayMonthYear(new Date(), { hours: -24 }) return datePivot(new Date(), { days: -1 }).getTime()
case 'week': case 'week':
return dayMonthYear(datePivot(new Date(), { days: -7 })) return datePivot(new Date(), { days: -7 }).getTime()
case 'month': case 'month':
return dayMonthYear(datePivot(new Date(), { days: -30 })) return datePivot(new Date(), { days: -30 }).getTime()
case 'year': case 'year':
return dayMonthYear(datePivot(new Date(), { days: -365 })) return datePivot(new Date(), { days: -365 }).getTime()
default: default:
return dayMonthYear(new Date('2021-05-01')) return new Date('2021-05-01').getTime()
} }
} }

View File

@ -7,7 +7,7 @@ import { COMMENT_TYPE_QUERY, ITEM_SORTS, ITEM_TYPES, WHENS } from '../../lib/con
import PageLoading from '../../components/page-loading' import PageLoading from '../../components/page-loading'
import { UserLayout } from '.' import { UserLayout } from '.'
import { Form, Select, DatePicker } from '../../components/form' import { Form, Select, DatePicker } from '../../components/form'
import { dayMonthYear, whenToFrom } from '../../lib/time' import { whenToFrom } from '../../lib/time'
const staticVariables = { sort: 'user' } const staticVariables = { sort: 'user' }
const variablesFunc = vars => ({ const variablesFunc = vars => ({
@ -96,7 +96,7 @@ function UserItemsHeader ({ type, name }) {
items={WHENS} items={WHENS}
overrideValue={when} overrideValue={when}
onChange={(formik, e) => { onChange={(formik, e) => {
const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: dayMonthYear(new Date()) } : {} const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: Date.now() } : {}
select({ ...formik?.values, when: e.target.value, ...range }) select({ ...formik?.values, when: e.target.value, ...range })
}} }}
/> />
@ -106,7 +106,7 @@ function UserItemsHeader ({ type, name }) {
fromName='from' toName='to' fromName='from' toName='to'
className='p-0 px-2 mb-2' className='p-0 px-2 mb-2'
onChange={(formik, [from, to], e) => { onChange={(formik, [from, to], e) => {
select({ ...formik?.values, from, to }) select({ ...formik?.values, from: from.getTime(), to: to.getTime() })
}} }}
from={router.query.from} from={router.query.from}
to={router.query.to} to={router.query.to}

View File

@ -10,7 +10,7 @@ import PageLoading from '../../components/page-loading'
import { WHENS } from '../../lib/constants' import { WHENS } from '../../lib/constants'
import dynamic from 'next/dynamic' import dynamic from 'next/dynamic'
import { numWithUnits } from '../../lib/format' import { numWithUnits } from '../../lib/format'
import { dayMonthYear, whenToFrom } from '../../lib/time' import { whenToFrom } from '../../lib/time'
const WhenComposedChart = dynamic(() => import('../../components/charts').then(mod => mod.WhenComposedChart), { const WhenComposedChart = dynamic(() => import('../../components/charts').then(mod => mod.WhenComposedChart), {
loading: () => <div>Loading...</div> loading: () => <div>Loading...</div>
@ -71,7 +71,7 @@ export default function Referrals ({ ssrData }) {
value={router.query.when || 'day'} value={router.query.when || 'day'}
noForm noForm
onChange={(formik, e) => { onChange={(formik, e) => {
const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: dayMonthYear(new Date()) } : {} const range = e.target.value === 'custom' ? { from: whenToFrom(when), to: Date.now() } : {}
select({ when: e.target.value, ...range }) select({ when: e.target.value, ...range })
}} }}
/> />
@ -83,7 +83,7 @@ export default function Referrals ({ ssrData }) {
toName='to' toName='to'
className='p-0 px-2 mb-2' className='p-0 px-2 mb-2'
onChange={(formik, [from, to], e) => { onChange={(formik, [from, to], e) => {
select({ when, from, to }) select({ when, from: from.getTime(), to: to.getTime() })
}} }}
from={router.query.from} from={router.query.from}
to={router.query.to} to={router.query.to}