您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

147 行
4.6KB

  1. import { Dictionary } from "@types";
  2. import { PageID, TabID } from "pages";
  3. import { get, isArray, isString, replace } from "lodash";
  4. type PathKey = [PageID, TabID?] | PageID;
  5. const makePathKey = (arg: PathKey): string => {
  6. if (isArray(arg)) {
  7. const tabStr = arg[1] !== undefined ? "/" + String(arg[1]) : "";
  8. return String(arg[0]) + tabStr;
  9. } else {
  10. return String(arg);
  11. }
  12. };
  13. const getPageId = (key: PathKey): PageID => {
  14. if (isArray(key)) {
  15. return key[0];
  16. } else {
  17. return key;
  18. }
  19. };
  20. const getTabId = (key: PathKey): TabID => {
  21. if (isArray(key)) {
  22. return key[1] ?? TabID.NONE;
  23. } else {
  24. return TabID.NONE;
  25. }
  26. };
  27. const PATHS_DASHBOARD = {
  28. [makePathKey(PageID.DASHBOARD_OVERVIEW)]: "/dashboard",
  29. // --契約-----------------------
  30. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_ENTRY)]:
  31. "/dashboard/contract/entry",
  32. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_LIST)]:
  33. "/dashboard/contract/list/:page",
  34. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_DETAIL)]:
  35. "/dashboard/contract/detail/:id",
  36. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_STICKER_RE_ORDER)]:
  37. "/dashboard/contract/sticker-re-order",
  38. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_SEASON_TICKET_RE_ORDER)]:
  39. "/dashboard/contract/season-ticket-re-order",
  40. [makePathKey(
  41. PageID.DASHBOARD_SEASON_TICKET_CONTRACT_PARKING_CERTIFICATE_ORDER
  42. )]: "/dashboard/contract/parking-certificate-order",
  43. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_TERMINATE_ORDER)]:
  44. "/dashboard/contract/terminate-order",
  45. [makePathKey(
  46. PageID.DASHBOARD_SEASON_TICKET_CONTRACT_UPDATE_VEHICLE_INFO_ORDER
  47. )]: "/dashboard/contract/update-vehicle-info-order",
  48. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_CHANGE_PLAN)]:
  49. "/dashboard/contract/change-plan",
  50. [makePathKey(PageID.DASHBOARD_USER_STUDENT_LICENSE_IMAGES_UPLOAD)]:
  51. "/dashboard/contract/upload/student-license",
  52. [makePathKey(PageID.DASHBOARD_USER_OTHER_LICENSE_IMAGES_UPLOAD)]:
  53. "/dashboard/contract/upload/other-license",
  54. [makePathKey(PageID.DASHBOARD_RECEIPT_DOWNLOAD)]:
  55. "/dashboard/receipt/download",
  56. [makePathKey(PageID.DASHBOARD_USER_DETAIL)]: "/dashboard/user/detail",
  57. [makePathKey(PageID.DASHBOARD_ASK)]: "/dashboard/ask",
  58. [makePathKey(PageID.DASHBOARD_USER_CHANGE_EMAIL_START)]:
  59. "/dashboard/change/email/start",
  60. [makePathKey(PageID.DASHBOARD_USER_UPDATE_USER_INFO)]:
  61. "/dashboard/update/user/info",
  62. [makePathKey(PageID.DASHBOARD_USER_BANK_REGISTER)]:
  63. "/dashboard/update/user/back-register",
  64. };
  65. const PATHS = {
  66. [makePathKey(PageID.NONE)]: "/",
  67. // 認証
  68. [makePathKey(PageID.LOGIN)]: "/login",
  69. [makePathKey(PageID.LOGOUT)]: "/logout",
  70. [makePathKey(PageID.USER_CHANGE_EMAIL_VERIFY)]: "/change/email/verify/:token",
  71. [makePathKey(PageID.USER_SETTING_PASSWORD_START)]: "/setting/password/start",
  72. [makePathKey(PageID.USER_SETTING_PASSWORD_VERIFY)]:
  73. "/setting/password/verify/:token",
  74. // 申込/選考
  75. [makePathKey(PageID.SEASON_TICKET_CONTRACT_SELECTION_ENTRY)]:
  76. "/season-ticket-contract/selection/entry/:selectionRecordNo/:entryRecordNo/:fs",
  77. [makePathKey(PageID.SEASON_TICKET_CONTRACT_ENTRY_CANCEL)]:
  78. "/season-ticket-contract/entry/cancel/:entryRecordNo/:fs",
  79. // ダッシュボード----------------
  80. ...PATHS_DASHBOARD,
  81. // その他
  82. [makePathKey(PageID.PAGE_403)]: "403",
  83. [makePathKey(PageID.PAGE_404)]: "404",
  84. };
  85. export type PathOption = {
  86. page?: number;
  87. query?: Dictionary;
  88. };
  89. export function getPath(key: PathKey, option?: PathOption) {
  90. const pageId = getPageId(key);
  91. const tabId = getTabId(key);
  92. let path = getRoute(pageId);
  93. // ページ番号解決
  94. path = replacePathParam(path, "page", option?.page ?? 0);
  95. // その他URLパラメータ変換
  96. if (option?.query !== undefined) {
  97. Object.keys(option.query).forEach((key) => {
  98. const value = get(option.query, key);
  99. if (value === undefined) return;
  100. path = replacePathParam(path, key, value);
  101. });
  102. }
  103. return path;
  104. }
  105. export function getListPagePath(key: PathKey, page: number): string {
  106. return getPath(key, { page });
  107. }
  108. export function getRoute(key: PathKey, exclude?: string): string {
  109. let path = get(PATHS, makePathKey(key));
  110. if (!path) throw new Error("ルート未定義:" + makePathKey(key));
  111. if (exclude) {
  112. path = replace(path, "/" + exclude + "/", "");
  113. }
  114. return path;
  115. }
  116. function replacePathParam(
  117. sourceStr: string,
  118. searchStr: string,
  119. replacement: string | number
  120. ): string {
  121. return replace(
  122. sourceStr,
  123. ":" + searchStr,
  124. isString(replacement) ? replacement : String(replacement)
  125. );
  126. }