IssueTimeline.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import Issue from "../components/Issue"
  2. import Category from "../components/Category"
  3. import { useState } from "react"
  4. import { FormattedMessage, useIntl, defineMessages } from "react-intl"
  5. const messages = defineMessages({
  6. started: { id: "roadmap.state.started", defaultMessage: "In Progress" },
  7. unstarted: { id: "roadmap.state.unstarted", defaultMessage: "Planned" },
  8. backlog: { id: "roadmap.state.backlog", defaultMessage: "Exploring" },
  9. completed: { id: "roadmap.state.completed", defaultMessage: "Recently completed" },
  10. })
  11. export const IssueTimeline = ({ roadmap }) => {
  12. const intl = useIntl()
  13. const [activeCategory, setActiveCategory] = useState("all")
  14. const filteredRoadmap = roadmap.map(state => {
  15. const filteredIssues = state.items.filter(
  16. ({ id }) => id.startsWith(activeCategory) || activeCategory === "all"
  17. )
  18. return {
  19. ...state,
  20. items: filteredIssues
  21. }
  22. }).filter(
  23. ({ items }) => items.length > 0
  24. )
  25. //prettier-ignore
  26. const categories = [
  27. { key: "all", label: intl.formatMessage({ id: "roadmap.all", defaultMessage: "All" }) },
  28. { key: "MAS", label: intl.formatMessage({ id: "roadmap.mastodon", defaultMessage: "Web / API" }) },
  29. { key: "IOS", label: intl.formatMessage({ id: "roadmap.ios", defaultMessage: "iOS" }) },
  30. { key: "AND", label: intl.formatMessage({ id: "roadmap.android", defaultMessage: "Android" }) },
  31. ]
  32. return (
  33. <div className="mt-56 md:mt-0 md:bg-white md:rounded-md md:p-6 pl-3">
  34. <div className="-mx-gutter pis-gutter mb-12 md:mb-6 overflow-x-auto">
  35. <div className="flex flex-wrap gap-gutter md:flex-nowrap">
  36. {categories.map(category => (
  37. <Category
  38. key={category.key}
  39. label={category.label}
  40. value={category.key}
  41. currentValue={activeCategory}
  42. onChange={(e) => setActiveCategory(e.target.value)}
  43. />
  44. ))}
  45. </div>
  46. </div>
  47. <div className="relative">
  48. <div className="absolute h-full w-0 border-dashed border-l border-gray-2" />
  49. {filteredRoadmap.map(state => (
  50. <div key={state.type} className="mb-8 pl-4 md:pl-8">
  51. <h2 className="h6 mb-4 text-black">{intl.formatMessage(messages[state.type])}</h2>
  52. <div className="space-y-2">
  53. {state.items.map(issue => <Issue key={issue.id} state={state.type} {...issue} />)}
  54. </div>
  55. </div>
  56. ))}
  57. </div>
  58. </div>
  59. )
  60. }
  61. export default IssueTimeline