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

154 行
5.0KB

  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(
  39. PageID.DASHBOARD_SEASON_TICKET_CONTRACT_PARKING_USE_TYPE_CHANGE_ORDER
  40. )]: "/dashboard/contract/parking-use-type-change-order",
  41. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_SEASON_TICKET_RE_ORDER)]:
  42. "/dashboard/contract/season-ticket-re-order",
  43. [makePathKey(
  44. PageID.DASHBOARD_SEASON_TICKET_CONTRACT_PARKING_CERTIFICATE_ORDER
  45. )]: "/dashboard/contract/parking-certificate-order",
  46. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_TERMINATE_ORDER)]:
  47. "/dashboard/contract/terminate-order",
  48. [makePathKey(
  49. PageID.DASHBOARD_SEASON_TICKET_CONTRACT_UPDATE_VEHICLE_INFO_ORDER
  50. )]: "/dashboard/contract/update-vehicle-info-order",
  51. [makePathKey(PageID.DASHBOARD_SEASON_TICKET_CONTRACT_CHANGE_PLAN)]:
  52. "/dashboard/contract/change-plan",
  53. [makePathKey(PageID.DASHBOARD_USER_STUDENT_LICENSE_IMAGES_UPLOAD)]:
  54. "/dashboard/contract/upload/student-license",
  55. [makePathKey(PageID.DASHBOARD_USER_OTHER_LICENSE_IMAGES_UPLOAD)]:
  56. "/dashboard/contract/upload/other-license",
  57. [makePathKey(PageID.DASHBOARD_RECEIPT_DOWNLOAD)]:
  58. "/dashboard/receipt/download",
  59. [makePathKey(PageID.DASHBOARD_USER_DETAIL)]: "/dashboard/user/detail",
  60. [makePathKey(PageID.DASHBOARD_ASK)]: "/dashboard/ask",
  61. [makePathKey(PageID.DASHBOARD_USER_CHANGE_EMAIL_START)]:
  62. "/dashboard/change/email/start",
  63. [makePathKey(PageID.DASHBOARD_USER_UPDATE_USER_INFO)]:
  64. "/dashboard/update/user/info",
  65. [makePathKey(PageID.DASHBOARD_USER_BANK_REGISTER)]:
  66. "/dashboard/update/user/back-register",
  67. [makePathKey(PageID.DASHBOARD_USER_CHANGE_PAYMENT_METHOD_CREDITCARD_ORDER)]:
  68. "/dashboard/order/user/payment-method/creditcard",
  69. [makePathKey(PageID.DASHBOARD_ROBOT_PAYMENT_CREDITCARD_REGISTER)]:
  70. "/dashboard/robot-payment/creditcard/register/:token",
  71. };
  72. const PATHS = {
  73. [makePathKey(PageID.NONE)]: "/",
  74. // 認証
  75. [makePathKey(PageID.LOGIN)]: "/login",
  76. [makePathKey(PageID.LOGOUT)]: "/logout",
  77. [makePathKey(PageID.USER_CHANGE_EMAIL_VERIFY)]: "/change/email/verify/:token",
  78. [makePathKey(PageID.USER_SETTING_PASSWORD_START)]: "/setting/password/start",
  79. [makePathKey(PageID.USER_SETTING_PASSWORD_VERIFY)]:
  80. "/setting/password/verify/:token",
  81. // 申込/選考
  82. [makePathKey(PageID.SEASON_TICKET_CONTRACT_SELECTION_ENTRY)]:
  83. "/season-ticket-contract/selection/entry/:selectionRecordNo/:entryRecordNo/:fs",
  84. [makePathKey(PageID.SEASON_TICKET_CONTRACT_ENTRY_CANCEL)]:
  85. "/season-ticket-contract/entry/cancel/:entryRecordNo/:fs",
  86. // ダッシュボード----------------
  87. ...PATHS_DASHBOARD,
  88. // その他
  89. [makePathKey(PageID.PAGE_403)]: "403",
  90. [makePathKey(PageID.PAGE_404)]: "404",
  91. };
  92. export type PathOption = {
  93. page?: number;
  94. query?: Dictionary;
  95. };
  96. export function getPath(key: PathKey, option?: PathOption) {
  97. const pageId = getPageId(key);
  98. const tabId = getTabId(key);
  99. let path = getRoute(pageId);
  100. // ページ番号解決
  101. path = replacePathParam(path, "page", option?.page ?? 0);
  102. // その他URLパラメータ変換
  103. if (option?.query !== undefined) {
  104. Object.keys(option.query).forEach((key) => {
  105. const value = get(option.query, key);
  106. if (value === undefined) return;
  107. path = replacePathParam(path, key, value);
  108. });
  109. }
  110. return path;
  111. }
  112. export function getListPagePath(key: PathKey, page: number): string {
  113. return getPath(key, { page });
  114. }
  115. export function getRoute(key: PathKey, exclude?: string): string {
  116. let path = get(PATHS, makePathKey(key));
  117. if (!path) throw new Error("ルート未定義:" + makePathKey(key));
  118. if (exclude) {
  119. path = replace(path, "/" + exclude + "/", "");
  120. }
  121. return path;
  122. }
  123. function replacePathParam(
  124. sourceStr: string,
  125. searchStr: string,
  126. replacement: string | number
  127. ): string {
  128. return replace(
  129. sourceStr,
  130. ":" + searchStr,
  131. isString(replacement) ? replacement : String(replacement)
  132. );
  133. }