@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.)
hq.recaptime.dev/wiki/Phorge
phorge
phabricator
1<?php
2
3final class PhabricatorProjectSilenceController
4 extends PhabricatorProjectController {
5
6 public function handleRequest(AphrontRequest $request) {
7 $viewer = $request->getViewer();
8 $id = $request->getURIData('id');
9 $action = $request->getURIData('action');
10
11 $project = id(new PhabricatorProjectQuery())
12 ->setViewer($viewer)
13 ->withIDs(array($id))
14 ->needMembers(true)
15 ->executeOne();
16 if (!$project) {
17 return new Aphront404Response();
18 }
19
20 $edge_type = PhabricatorProjectSilencedEdgeType::EDGECONST;
21 $done_uri = "/project/members/{$id}/";
22 $viewer_phid = $viewer->getPHID();
23
24 if (!$project->isUserMember($viewer_phid)) {
25 return $this->newDialog()
26 ->setTitle(pht('Not a Member'))
27 ->appendParagraph(
28 pht(
29 'You are not a project member, so you do not receive mail sent '.
30 'to members of this project.'))
31 ->addCancelButton($done_uri);
32 }
33
34 $silenced = PhabricatorEdgeQuery::loadDestinationPHIDs(
35 $project->getPHID(),
36 $edge_type);
37 $silenced = array_fuse($silenced);
38 $is_silenced = isset($silenced[$viewer_phid]);
39
40 if ($request->isDialogFormPost()) {
41 if ($is_silenced) {
42 $edge_action = '-';
43 } else {
44 $edge_action = '+';
45 }
46
47 $xactions = array();
48 $xactions[] = id(new PhabricatorProjectTransaction())
49 ->setTransactionType(PhabricatorTransactions::TYPE_EDGE)
50 ->setMetadataValue('edge:type', $edge_type)
51 ->setNewValue(
52 array(
53 $edge_action => array($viewer_phid => $viewer_phid),
54 ));
55
56 $editor = id(new PhabricatorProjectTransactionEditor())
57 ->setActor($viewer)
58 ->setContentSourceFromRequest($request)
59 ->setContinueOnNoEffect(true)
60 ->setContinueOnMissingFields(true)
61 ->applyTransactions($project, $xactions);
62
63 return id(new AphrontRedirectResponse())->setURI($done_uri);
64 }
65
66 if ($is_silenced) {
67 $title = pht('Enable Mail');
68 $body = pht(
69 'When mail is sent to members of this project, you will receive a '.
70 'copy.');
71 $button = pht('Enable Project Mail');
72 } else {
73 $title = pht('Disable Mail');
74 $body = pht(
75 'When mail is sent to members of this project, you will no longer '.
76 'receive a copy.');
77 $button = pht('Disable Project Mail');
78 }
79
80 return $this->newDialog()
81 ->setTitle($title)
82 ->appendParagraph($body)
83 ->addCancelButton($done_uri)
84 ->addSubmitButton($button);
85 }
86
87}