Ei kuvausta
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

decks.ts 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /// <reference path="../external/react/react.d.ts"/>
  2. /// <reference path="./header.ts"/>
  3. module rpgcards {
  4. const deckColor = "#F44336";
  5. function deckTile(deck: Deck, cards: string[]) {
  6. return <React.ReactElement<any>> DeckTile({
  7. key : deck.id,
  8. id : deck.id,
  9. name : deck.name,
  10. desc : deck.description,
  11. cards : cards.length,
  12. icon : null,
  13. color : deckColor });
  14. }
  15. function loadingTile(id: string) {
  16. return <React.ReactElement<any>> DeckTile({
  17. key : id,
  18. id : id,
  19. name : "Loading...",
  20. desc : "",
  21. cards : null,
  22. icon : null,
  23. color : deckColor });
  24. }
  25. function errorTile(id: string, e: Error) {
  26. return <React.ReactElement<any>> DeckTile({
  27. key : id,
  28. id : id,
  29. name : "Error",
  30. desc : e.message,
  31. cards : null,
  32. icon : null,
  33. color : deckColor });
  34. }
  35. function newDeckTile() {
  36. return <React.ReactElement<any>> DeckTile({
  37. key : "#new",
  38. id : null,
  39. name : "New deck",
  40. desc : null,
  41. cards : null,
  42. icon : "add circle",
  43. color : deckColor });
  44. }
  45. export function renderDecks(store: Store): React.ReactElement<any> {
  46. var decks = store.getDeckList().fmap(deckIds => deckIds.map(id => {
  47. let deck = store.getDeck(id);
  48. return deck.lift(deck => {
  49. return <React.ReactElement<any>> DeckTile({
  50. key : deck.id,
  51. id : deck.id,
  52. desc: deck.description,
  53. name: deck.name});
  54. }).caseOf({
  55. just: (t) => t,
  56. nothing: (e) => errorTile(id, e),
  57. pending: () => loadingTile(id)
  58. });
  59. })).caseOf({
  60. just: (t) => t,
  61. nothing: (e) => [React.DOM.div({}, "error: " + e.message)],
  62. pending: () => [React.DOM.div({}, "loading...")]
  63. });
  64. return React.DOM.div({}
  65. , renderHeader(store)
  66. , React.DOM.div({ className: 'decks' }
  67. , decks
  68. , newDeckTile()
  69. ));
  70. }
  71. }