sequencer.ts 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import { TerminalTyper } from './terminal-typer';
  2. export class Sequencer {
  3. private readonly playTimer: { [name: string]: number; };
  4. private readonly onTransition?: (className: string) => void;
  5. constructor(private sceneElement: HTMLDivElement,
  6. private terminal: TerminalTyper,
  7. onTransitionFn?: (className: string) => void) {
  8. this.sceneElement = sceneElement;
  9. this.playTimer = {};
  10. this.onTransition = onTransitionFn;
  11. }
  12. async play() {
  13. Object.values(this.playTimer).forEach(k => clearTimeout(k));
  14. await this.sleep('initial', 0);
  15. this.scene0();
  16. await this.sleep('start-typing', 1000);
  17. this.scene1();
  18. await this.sleep('zoom-out', 1500);
  19. this.scene2();
  20. await this.sleep('data-flow', 1200);
  21. this.scene3();
  22. await this.sleep('websites', 1000);
  23. this.scene4();
  24. await this.sleep('logo', 2000);
  25. this.scene5();
  26. await this.sleep('final', 1000);
  27. this.scene6();
  28. }
  29. jumpTo(scene: 0 | 1 | 2 | 3 | 4 | 5 | 6) {
  30. Object.values(this.playTimer).forEach(k => clearTimeout(k));
  31. (this as any)['scene' + scene]();
  32. }
  33. private scene0() {
  34. this.setScene('scene-0');
  35. this.terminal.clear();
  36. }
  37. private scene1() {
  38. this.setScene('scene-1');
  39. this.terminal.start();
  40. }
  41. private scene2() {
  42. this.setScene('scene-2');
  43. this.terminal.fill();
  44. }
  45. private scene3() {
  46. this.setScene('scene-3');
  47. this.terminal.fill();
  48. }
  49. private scene4() {
  50. this.setScene('scene-4');
  51. this.terminal.fill();
  52. }
  53. private scene5() {
  54. this.setScene('scene-5');
  55. this.terminal.fill();
  56. }
  57. private scene6() {
  58. this.setScene('scene-6');
  59. this.terminal.fill();
  60. }
  61. private setScene(className: string) {
  62. this.sceneElement.classList.value = `visible scene ${className}`;
  63. if (typeof this.onTransition === 'function') {
  64. this.onTransition(className);
  65. }
  66. }
  67. private sleep(id: string, duration: number) {
  68. clearTimeout(this.playTimer[id]);
  69. return new Promise(resolve => {
  70. this.playTimer[id] = setTimeout(resolve, duration);
  71. });
  72. }
  73. }