Última actividad 1 day ago

curiouser's Avatar Winston Hoy revisó este gist 9 years ago. Ir a la revisión

1 file changed, 59 insertions

color-graduation.js(archivo creado)

@@ -0,0 +1,59 @@
1 + // Vanilla solution
2 + let format = require('util').format;
3 +
4 + const COLORS = [
5 + { stop: 0, rgb: [35, 198, 161] },
6 + { stop: 6, rgb: [245, 235, 73] },
7 + { stop: 48, rgb: [245, 51, 0] },
8 + ];
9 +
10 + function getRGBColor (hours) {
11 + // ordering of max and min IS IMPORTANT as we're mutating the colors array with reverse
12 + let colors = COLORS.slice(0),
13 + min = colors.reduce((min, color) => color.stop <= hours ? color : min),
14 + max = colors.reverse().reduce((max, color) => color.stop >= hours ? color : max),
15 + normalizationFactor;
16 +
17 + // control for out of bounds, use the same value twice in such an event
18 + max = max || min;
19 + min = min || max;
20 +
21 + // calculate the normalization factor, should always be between 0 - 1
22 + normalizationFactor = (hours - min.stop) / (max.stop - min.stop);
23 +
24 + // at this point we don't care about the stops anymore, just the rgb and factor
25 + // calculate and return one RGB array
26 + return min.rgb.map((c, i) => {
27 + let rgb1 = min.rgb[i],
28 + rgb2 = max.rgb[i],
29 + normalizedDiff = (rgb2 - rgb1) * normalizationFactor,
30 +
31 + return Math.round(rgb1 + normalizedDiff);
32 + });
33 + }
34 +
35 + // Timer logic
36 + // Pretty shitty but just playing around
37 + function simulateTime () {
38 + const NOW = Date.now();
39 + const eventDate = NOW + (1000 * 60 * 60 * 24 * 2); // 2 days from now
40 +
41 + let currentTime = NOW;
42 +
43 + let interval = setInterval(() => {
44 + if (currentTime < eventDate) {
45 + let duration = eventDate - currentTime,
46 + hours = Math.ceil(duration / 1000 / 60 / 60),
47 + color = getRGBColor(hours);
48 +
49 + console.log(`${format(color)} ${new Date(currentTime).toString()} ${hours} hours before the event`);
50 +
51 + currentTime += 1000 * 60 * 60 * 2; // increment by 2 hours
52 + }
53 + else if (currentTime >= eventDate + 3000) {
54 + clearInterval(interval);
55 + }
56 + }, 1000);
57 + }
58 +
59 + simulateTime();
Siguiente Anterior