[ABANDONED] React/Redux front end for the Flexor social network.
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.

223 lines
6.8 KiB

5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
  1. import { apiFetch } from '../api'
  2. import { setEntities } from '../actions/entities'
  3. import { listSet, listAppend } from '../actions/lists'
  4. import { startRequest, finishRequest } from '../actions/requests'
  5. import { objectToQuerystring } from '../utils'
  6. import { normalize } from '../utils/normalization'
  7. import { AppThunkAction, Entity, RequestKey, EntityType, User, EntityListKey } from '../types'
  8. export const fetchGroup = (id: string): AppThunkAction => {
  9. return async dispatch => {
  10. dispatch(startRequest(RequestKey.FetchGroup))
  11. try {
  12. const group = await apiFetch<Entity>({
  13. path: `/v1/group/${id}`
  14. })
  15. const groups = normalize([group], EntityType.Group)
  16. dispatch(setEntities(groups.entities))
  17. dispatch(finishRequest(RequestKey.FetchGroup, true))
  18. } catch (err) {
  19. dispatch(finishRequest(RequestKey.FetchGroup, false))
  20. throw err
  21. }
  22. }
  23. }
  24. interface GroupsResponse {
  25. groups: Entity[]
  26. continuation?: string
  27. }
  28. export const fetchGroups = (sort?: string, continuation?: string): AppThunkAction => async dispatch => {
  29. dispatch(startRequest(RequestKey.FetchGroups))
  30. try {
  31. const response = await apiFetch<GroupsResponse>({
  32. path: `/v1/groups?${objectToQuerystring({ sort, continuation })}`,
  33. })
  34. const groups = normalize(response.groups, EntityType.Group)
  35. dispatch(setEntities(groups.entities))
  36. if (continuation) {
  37. dispatch(listAppend(EntityListKey.Groups, groups.keys, response.continuation))
  38. } else {
  39. dispatch(listSet(EntityListKey.Groups, groups.keys, response.continuation))
  40. }
  41. dispatch(finishRequest(RequestKey.FetchGroups, true))
  42. } catch (err) {
  43. dispatch(finishRequest(RequestKey.FetchGroups, false))
  44. throw err
  45. }
  46. }
  47. interface GroupMembersResponse {
  48. members: User[]
  49. continuation?: string
  50. }
  51. export const fetchGroupMembers = (id: string, type?: string, continuation?: string): AppThunkAction => async dispatch => {
  52. dispatch(startRequest(RequestKey.FetchGroupMembers))
  53. try {
  54. const response = await apiFetch<GroupMembersResponse>({
  55. path: `/v1/group/${id}/members?${objectToQuerystring({ type, continuation })}`,
  56. })
  57. const users = normalize(response.members, EntityType.User)
  58. dispatch(setEntities(users.entities))
  59. if (continuation) {
  60. dispatch(listAppend(EntityListKey.GroupMembers, users.keys, response.continuation))
  61. } else {
  62. dispatch(listSet(EntityListKey.GroupMembers, users.keys, response.continuation))
  63. }
  64. dispatch(finishRequest(RequestKey.FetchGroupMembers, true))
  65. } catch (err) {
  66. dispatch(finishRequest(RequestKey.FetchGroupMembers, false))
  67. throw err
  68. }
  69. }
  70. interface GroupLogsResponse {
  71. logs: Entity[]
  72. continuation?: string
  73. }
  74. export const fetchLogs = (continuation?: string): AppThunkAction => async dispatch => {
  75. dispatch(startRequest(RequestKey.FetchGroupLogs))
  76. try {
  77. const response = await apiFetch<GroupLogsResponse>({
  78. path: `/v1/group/logs?${objectToQuerystring({ continuation })}`,
  79. })
  80. const logs = normalize(response.logs, EntityType.Log)
  81. dispatch(setEntities(logs.entities))
  82. if (continuation) {
  83. dispatch(listAppend(EntityListKey.Logs, logs.keys, response.continuation))
  84. } else {
  85. dispatch(listSet(EntityListKey.Logs, logs.keys, response.continuation))
  86. }
  87. dispatch(finishRequest(RequestKey.FetchGroupLogs, true))
  88. } catch (err) {
  89. dispatch(finishRequest(RequestKey.FetchGroupLogs, false))
  90. throw err
  91. }
  92. }
  93. interface CreateInvitationResponse {
  94. code: string
  95. }
  96. export const createInvitation = (expiration?: number, limit?: number): AppThunkAction<string> => async dispatch => {
  97. dispatch(startRequest(RequestKey.CreateInvitation))
  98. try {
  99. const response = await apiFetch<CreateInvitationResponse>({
  100. path: `/v1/group/invitation`,
  101. method: 'post',
  102. body: {
  103. expiration,
  104. limit,
  105. }
  106. })
  107. dispatch(finishRequest(RequestKey.CreateInvitation, true))
  108. return response.code
  109. } catch (err) {
  110. dispatch(finishRequest(RequestKey.CreateInvitation, false))
  111. throw err
  112. }
  113. }
  114. interface InvitationsResponse {
  115. invitations: Entity[]
  116. continuation?: string
  117. }
  118. export const fetchInvitations = (): AppThunkAction => async dispatch => {
  119. dispatch(startRequest(RequestKey.FetchInvitations))
  120. try {
  121. const response = await apiFetch<InvitationsResponse>({
  122. path: `/v1/group/invitations`,
  123. })
  124. const invitations = normalize(response.invitations, EntityType.Invitation)
  125. dispatch(setEntities(invitations.entities))
  126. dispatch(listSet(EntityListKey.Invitations, invitations.keys, response.continuation))
  127. dispatch(finishRequest(RequestKey.FetchInvitations, true))
  128. } catch (err) {
  129. dispatch(finishRequest(RequestKey.FetchInvitations, false))
  130. throw err
  131. }
  132. }
  133. export const updateGroup = (id: string, updates: object): AppThunkAction => async dispatch => {
  134. dispatch(startRequest(RequestKey.UpdateGroup))
  135. try {
  136. await apiFetch({
  137. path: `/v1/group/${id}`,
  138. method: 'put',
  139. body: updates,
  140. })
  141. dispatch(finishRequest(RequestKey.UpdateGroup, true))
  142. } catch (err) {
  143. dispatch(finishRequest(RequestKey.UpdateGroup, false))
  144. throw err
  145. }
  146. }
  147. interface FetchPendingGroupsResponse {
  148. groups: Entity[]
  149. continuation?: string
  150. }
  151. export const fetchPendingGroups = (continuation?: string): AppThunkAction => async dispatch => {
  152. dispatch(startRequest(RequestKey.FetchPendingGroups))
  153. try {
  154. const response = await apiFetch<FetchPendingGroupsResponse>({
  155. path: `/v1/groups/pending?${objectToQuerystring({ continuation })}`,
  156. method: 'get',
  157. })
  158. const groups = normalize(response.groups, EntityType.Group)
  159. dispatch(setEntities(groups.entities))
  160. dispatch(listSet(EntityListKey.PendingGroups, groups.keys, response.continuation))
  161. dispatch(finishRequest(RequestKey.FetchPendingGroups, true))
  162. } catch (err) {
  163. dispatch(finishRequest(RequestKey.FetchPendingGroups, false))
  164. throw err
  165. }
  166. }
  167. export const activateGroup = (id: string): AppThunkAction => async dispatch => {
  168. dispatch(startRequest(RequestKey.ActivateGroup))
  169. try {
  170. await apiFetch({
  171. path: `/v1/group/${id}/activate`,
  172. method: 'post',
  173. })
  174. dispatch(finishRequest(RequestKey.ActivateGroup, true))
  175. } catch (err) {
  176. dispatch(finishRequest(RequestKey.ActivateGroup, false))
  177. throw err
  178. }
  179. }